Codeforces #495 div.2(A, B, C)

A.模拟

#include <iostream>


using namespace std;

int n, d, ans;
int a[105];

int main(){
    cin >> n >> d;
    for(int i = 1; i <= n; i++)
        cin>> a[i];
    ans += 2;
    for(int i = 2; i <= n; i++){
        if(a[i] - a[i-1] == 2*d)
            ans++;
        if(a[i] - a[i-1] > 2*d)
            ans += 2;
    }
    cout << ans;
return 0;
}

B.由均值不等式,直接输出0101…或1010….即可

#include <iostream>
#include <cstdio>
using namespace std;
int main(){
    int n, m, l, r;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; i++){
        scanf("%d %d", &l, &r);
    }
    for(int i = 1; i <= n; i++){
        if(i & 1)
            printf("0");
        else
            printf("1");
    }
    printf("\n");
return 0;
}

C. 模拟
按照一般想法,从前往后,对每个数字,其后面的数字都可以与之配对。
但这样是有重复的。
所以处理出每个数(不同的)后面不同的数有几个。答案加上即可。

#include <iostream>
#include <cstdio>

using namespace std;

int n;
int a[100005];
int ans[100005];
bool v1[100005];
bool v2[100005];

int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
    }
    int sum = 0;
    for(int i = n; i >= 1; i--){
        ans[i] = sum;
        if(! v2[ a[i] ]){
            v2[a[i]] = true;
            sum++;
        }
    }
    long long cnt = 0;
    for(int i = 1; i <= n; i++){
        if(! v1[a[i]]){
            v1[a[i]] = true;
            cnt += ans[i];
        }
    }
    printf("%I64d\n", cnt);
return 0;
}

猜你喜欢

转载自blog.csdn.net/yczhaoxun/article/details/81626270
今日推荐