由于A,B,C太简单了,所以不放思路。
这题由于白点一定在黑点的右下方,所以可以得到公式 \(X_a - X_b + Y_a - Y_b\) 在由于距离和顺序无关,所以在输入的时候可以直接累加答案
#include <bits/stdc++.h>
using namespace std;
int x, y;
long long ans = 0;
int main () {
int n;
cin >> n;
for (int i = 1; i <= n; i ++) cin >> x >> y, ans = ans - x + y;
for (int i = 1; i <= n; i ++) cin >> x >> y, ans = ans + x - y;
cout << ans;
return 0;
}
这题是一道区间dp题,我们把连续的1的区间记录下来,在逆向循环一遍区间,统计合并的最小值。合并还有一些条件,具体看代码
#include <bits/stdc++.h>
using namespace std;
int a[30];
int n, m = 0;
int dp[30][2];
int dis[30], num1 = 0;
int main () {
cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) {
if (a[i] == 1) {
dp[++ m][0] = i;
while (a[i] == 1) {
i ++;
}
dp[m][1] = i;
}
if (i == n + 1) break;
}
for (int i = m; i >= 1; i --) {
num1 = 0;
dis[i] = 100000;
for (int j = i; j <= m; j ++) {
num1 += dp[j][1] - dp[j][0];
int len = dp[j][1] - dp[i][0];
if (len >= 8) break; //条件1
if (len == 6 && a[dp[i][0] + 2] == 1 && a[dp[i][0] + 3] == 1) break; //条件2
if (len == 7 && a[dp[i][0] + 3] == 1) break; //条件3
int temp = max (4, len) - num1;
dis[i] = min (dis[i], temp + dis[j + 1]);
}
}
cout << dis[1];
return 0;
}
原文:https://www.cnblogs.com/binghun/p/14074771.html