Codeforces 补题 round 3 contest 990

A. Commentary Boxes

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define ll long long

const int maxn = 1e6+10;
const int mod = 2008;
const int N = 3010;

ll n,m,a,b;
int main(){
    while(scanf("%lld%lld%lld%lld",&n,&m,&a,&b)!=EOF){
        if(n % m == 0)
            printf("0\n");
        else{
            ll x = n / m;
            ll y = (n / m) + 1;
            printf("%lld\n",min((y*m-n)*a,(n-m*x)*b));
        }
    }
    return 0;
}

B. Micro-World

思路:用map标记一下出现的次数,在遍历的时候直接减下去。

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define ll long long

const int maxn = 1e6+10;
const int mod = 2008;
const int N = 3010;

int n,k;
int a[maxn];
bool cmp(int a,int b){
    return a > b;
}

int main(){
    while(scanf("%d%d",&n,&k)!=EOF){
        clr(a);
        map<int,int>mp;
        for(int i=1;i<=n;i++) {
            scanf("%d",&a[i]);
            mp[a[i]]++;
        }
        sort(a+1,a+n+1,cmp);
        int pos = n;
        for(int i=n-1;i>=1;i--){
            if(a[i]>a[i+1]&&a[i]<=(a[i+1]+k)){
                pos = pos - mp[a[i+1]];
            }
        }
        printf("%d\n",pos);
    }
    return 0;
}

C. Bracket Sequences Concatenation Problem

思路:最开始用栈简化括号的时候搞错了。索性直接用数组模拟了。

把每个字符串全部简化为最简形式。只有四种情况,1、全是左括号,2、全是右括号,3、空串(完全匹配),4、既有左括号也有右括号(不符合要求)。然后根据规律累加即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define clr(a) memset(a,0,sizeof(a))

const int maxn = 1e6+10;

ll n;
struct node{
    ll l,r;
}p[maxn];
ll num[2][maxn];
int main(){
    while(scanf("%lld",&n)!=EOF){
        clr(p);clr(num);
        char s[maxn];
        ll ans = 0;
        for(int i=0;i<n;i++){
            scanf("%s",s);
            int len = strlen(s);
            for(int j=0;j<len;j++){
                if(s[j]==')'){
                    if(p[i].l)  p[i].l --;
                    else p[i].r ++;
                }
                else p[i].l ++;
            }
            if(p[i].l&&p[i].r) continue;
            if(p[i].l)  num[0][p[i].l]++;
            else if(p[i].r) num[1][p[i].r]++;
            else ans ++;
        }
        ans *= ans;
        for(int i=1;i<maxn;i++)
            ans += num[0][i] * num[1][i];
        cout<<ans<<endl;
    }
    return 0;
}

D. Graph And Its Complement

待补

猜你喜欢

转载自blog.csdn.net/l18339702017/article/details/81637455