其他分享
首页 > 其他分享> > Codeforces Round #624 (Div. 3)

Codeforces Round #624 (Div. 3)

作者:互联网

A
选正奇数 增加,正奇数减少,首先判断两个数的大小关系。看是该增加还是减少,然后答案显然只有0,1,2。

int main(){
    int t = read();
    while(t--){
        ll a,b;
        a = read();b = read();
        if(a == b) puts("0");
        else if(a < b){
            if((b - a) % 2 != 0) puts("1");
            else {
                puts("2");
            }
        }
        else{
            if((a - b) % 2 == 0) puts("1");
            else puts("2");
        }
    }
}

B
给你nnn个数字,然后再给你mmm个数,p1,p2...pmp_1,p_2...p_mp1​,p2​...pm​,你可使任意次交换pi,pi+1p_i,p_i+1pi​,pi​+1处的 位置。问你是否可以排成非递减序列。
思路:
冒泡即可。只不过只能交换pi,pi+1p_i,p_i+1pi​,pi​+1位置的数。
O(nm)O(n\cdot m)O(n⋅m)

int a[200];
int b[200];
int main(){
    int t = read();
    while(t--){
        int n = read(),m = read();
        for(int i = 1;i <= n;++i) a[i] = read();
        for(int i = 1;i <= m;++i){
            b[i] = read();
        }
        for(int i = 1;i <= n;++i){
            for(int j = 1;j <= m;++j){
                if(a[b[j]] > a[b[j]+1]) swap(a[b[j]],a[b[j]+1]);
            }
        }
        if(is_sorted(a+1,a+n+1)) puts("YES");
        else puts("NO");
    }
}

C
给你一个一个字符串,里面的字母代表开关,你从头开始按,按到某一处出错后,下一次要从头开始按。给你 m个数,代表着按错的开关的位置。让你输出26个字母。表示开关被按下的次数。
思路:
开关在第iii个位置处出错,说明第iii个位置按下后,下一次要从1开始按,也就是[1,i][1,i][1,i]位置的开关都多按了一次。我们不妨设有一个数组ddd,d[i]d[i]d[i]意思是iii之前的位置多按了几次。然后遍历mmm个错误个位置累加贡献,最后倒着累加,最后统计即可。

ll f[N];
char s[N];
ll b[28];
int main(){
    int t = read();
    while(t--){
        memset(f,0,sizeof f);
        memset(b,0,sizeof b);
        int n = read(),m = read();
        scanf("%s",s+1);
        for(int i = 1;i <= m;++i){
            ll a=  read();
            f[a] ++;
        }
        for(int i = n-1;i >= 1;i--) f[i] += f[i+1];
        for(int i = 1;i <= n;++i){
            b[s[i]-'a'] += f[i] + 1;
        }
        for(int i = 0;i < 26;++i) printf("%lld ",b[i]);
        puts("");
    }
}

D
题意给你三个数A,B,CA,B,CA,B,C,然后每个数都可以+1 / -1。让你输出A | B && B | C 需要进行的最小操作数。
思路:
1、枚举倍数
复杂度为nlognnlognnlogn级別,并非n2n^2n2级别。。。还要注意上线设大些

int res[3];
int main(){
    int t = read();
    while(t--){
        ll a = read(),b = read(),c = read();
        ll ans = INF;
        for(int i = 1;i <= 2e4;++i){
            for(int j = i;j <= 2e4;j += i){
                for(int k = j;k <= 2e4;k += j){
                   int d = abs(i-a)+abs(j-b)+abs(k-c);
                   if(ans > d) {ans = d;res[0] = i;res[1] = j;res[2] = k;}
                }
            }
        }
        cout << ans<<endl;
 
        cout << res[0] <<' '<<res[1] <<' '<<res[2]<<endl;
    }
}

2、预处理2e42e42e4级别的因子,枚举bbb,然后O(1)O(1)O(1)得到c,然后a必为b的因子,枚举一下a。取最小。

int res[3];
vector<int> Q[N];
void init(){
    for(int i = 1;i <= 2e4;++i){
        for(int j = 1;j <= sqrt(i);++j){
            if(i % j == 0) {Q[i].push_back(j);if(i/j != j) Q[i].push_back(i/j);}
        }
    }
}
int main(){
    init();
    int t = read();
    while(t--){
        ll a = read(),b = read(),c = read();
        ll ans = INF;
        for(int i = 1;i <= 2e4;++i){
            int d = c / i;
            int c1 = d * i,c2 = (d+1)*i;
            if(abs(c1-c) > abs(c2-c)) swap(c1,c2);//c1为c
            ll sum = abs(c1 - c) + abs(i-b);
            int S = Q[i].size();
            for(int j = 0;j < S;++j){
                ll a1 = Q[i][j];//枚举a值
                if(ans > sum + abs(a-a1)) ans = sum + abs(a-a1),res[0] = a1,res[1] = i,res[2] = c1;
            }
        }
        cout << ans<<endl;
        cout << res[0] <<' '<<res[1] <<' '<<res[2]<<endl;
    }
}

E
F

冷血怪兽 发布了588 篇原创文章 · 获赞 31 · 访问量 5万+ 他的留言板 关注

标签:puts,624,int,res,ll,Codeforces,read,Div,pi
来源: https://blog.csdn.net/qq_43408238/article/details/104500116