SRM 596 DIV2
250pt:
直接枚举跳过的位置求和即可。
int n,m; int ABS(int a) { if (a < 0) return (-a); else return a; } class FoxAndSightseeing { public: int getMin(vector <int> p) { n = p.size(); int ans = 0; for (int i = 1; i < n - 1; ++i) { int s = p[0]; int tmp = 0; for (int j = 1; j < n; ++j) { if (j == i) continue; tmp += ABS(p[j] - s); s = p[j]; } if (ans == 0 || ans > tmp) ans = tmp; } return ans; } };
500pt:
很简单的O(n^2)的DP:
const int inf = 0x7fffffff; int n,m; int dp[N]; bool isok(char a, char b) { if ((a == 'R' && b == 'G') || (a == 'G' && b == 'B') || (a == 'B' && b == 'R')) return true; return false; } class ColorfulRoad { public: int getMin(string road) { n = road.size(); for (int i = 0; i < n; ++i) dp[i] = inf; dp[0] = 0; for (int i = 1; i < n; ++i) { for (int j = 0; j < i; ++j) { if (isok(road[j],road[i]) && dp[j] != inf) { dp[i] = min(dp[i],dp[j] + (i - j)*(i - j)); } } } if (dp[n - 1] == inf) return -1; else return dp[n - 1]; } };
1000pt:
题意:
F(n) = (n - 0^2) * (n - 1^2) * (n - 2^2) * (n - 3^2) * ... * (n - k^2), k满足n - k^2 > 0
然后给出lo,hi,p, 求lo到hi之间的i满足f(i)%p == 0的个数
lo,div取值为[1,10^12];
思路:
比赛的时候想的很乱没写出来,后来想了想当时的思路是错的。无语.....
http://codeforces.com/blog/entry/9405?locale=en CF有人讨论了这道题目,一看就明白了。 哎....没有想到啊。
我大体说一下思路:
f(n)如果能被p整出,那么f(n)中肯定存在(n - i^2)%p == 0. i*i < 10^12 那么i <10^6;
又有n%p == i^2 % p; ---> n = i^2 + k*p, i^2 + k*p < A 所以如果求[1,A]中满足的个数的话,那么其值就为(A - i^2)/p; 如果我们单纯枚举的话求值的话中间会有重复计算的j^2%p = i^2%p; 所以我们利用set记录一下重复的然后计算即可。
ll getSum(ll A, ll p) { set<ll> mods; ll ans = 0; for (ll i = 0LL; i * i < A; ++i) { if (mods.find((i*i % p)) != mods.end()) continue; mods.insert(i*i % p); ans += (A - i * i)/p; } return ans; } class SparseFactorialDiv2 { public: long long getCount(long long lo, long long hi, long long d) { return getSum(hi, d) - getSum(lo - 1, d); } };