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; 
        } 


}; 
View Code

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]; 
        } 


}; 
View Code

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);
    }

};

  

原文地址:https://www.cnblogs.com/E-star/p/3403518.html