Codeforces_820

A.直接模拟。

#include<bits/stdc++.h>
using namespace std;

int c,v0,v1,a,l;

int main()
{
    ios::sync_with_stdio(0);
    cin >> c >> v0 >> v1 >> a >> l;
    int ans = 0,now = l,v = v0-a;
    while(1)
    {
        ans++;
        now -= l;
        v += a;
        if(v > v1)  v = v1;
        now += v;
        if(now >= c)    break;
    }
    cout << ans << endl;
    return 0;
}
View Code

B.相等弧长对应的圆周角相等。圆周角是对应圆心角的一半。

#include<bits/stdc++.h>
using namespace std;

int n,a;

int main()
{
    ios::sync_with_stdio(0);
    cin >> n >> a;
    double t = 180.0/n;
    int ans;
    double minn = 360;
    for(int i = 1;i <= n-2;i++)
    {
        if(abs(i*t-a) < minn)
        {
            ans = i+2;
            minn = abs(i*t-a);
        }
    }
    cout << "2 1 " << ans << endl;
    return 0;
}
View Code

D.统计数值大于等于位置的个数和数值小于位置的个数,以及每个偏差值的个数,每次向右移动的时候,可以O(1)更新答案,注意每次更新三个计数。

#include<bits/stdc++.h>
using namespace std;

int n,a[1000005],cnt[1000005];

int main()
{
    ios::sync_with_stdio(0);
    cin >> n;
    for(int i = 1;i <= n;i++)   cin >> a[i];
    long long sum = 0,cntl = 0,cntr = 0;
    for(int i = 1;i <= n;i++)
    {
        sum += abs(a[i]-i);
        if(a[i] >= i)
        {
            cntl++;
            cnt[a[i]-i]++;
        }
        else    cntr++;
    }
    long long ans = sum;
    int num = 0;
    for(int i = 1;i < n;i++)
    {
        cntl -= cnt[i-1];
        cntr += cnt[i-1];
        sum = sum-cntl+cntr-abs(a[n-i+1]-n-1)+abs(a[n-i+1]-1);
        if(a[n-i+1]+i-1 < n)    cnt[a[n-i+1]+i-1]++;
        cntl++;
        cntr--;
        if(sum < ans)
        {
            ans = sum;
            num = i;
        }
    }
    cout << ans << " " << num << endl;
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhurb/p/7231558.html