Codeforces Round #732 (Div. 2) ABC题解

链接:Codeforces Round #732(Div. 2)

A-AquaMoon and Two Arrays

题意:给你两个数组a[],b[],每次选择两个下标i,j,则a[i]-1,a[j]+1。问你操作多少次使a[]变成b[],并输出操作过程的i和j的值,如果不存在,则输出-1。
思路:类似于双指针,index1=1,index2=1遍历两个数组,再另外开两个数组存储index1和index2的值。当ans != sum 时,输出-1。
代码:

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

int t,n;
int a[105],b[105],c[105],d[105];

int main(){
    cin>>t;
    while(t--){
        cin>>n;
        int sum=0,ans=0;
        for(int i=1; i <= n; i++){
            cin>>a[i];
            sum+=a[i];
        }
        for(int i=1; i <= n; i++){
            cin>>b[i];
            ans+=b[i];
        }
        if(ans != sum){
            cout<<"-1"<<endl;
            continue;
        }
        int k=0,i=1,j=1;
        while(i <= n && j <= n){
            if(a[i] >= b[i]) i++;
            if(a[j] <= b[j]) j++;
            while(a[i] < b[i] && a[j] > b[j]){
                a[i]++;a[j]--;
                k++;
                c[k]=j;d[k]=i;
            }
        }
        cout<<k<<endl;
        for(int i=1; i <= k; i++){
            cout<<c[i]<<" "<<d[i]<<endl;
        }
    }
    return 0;
}

B- AquaMoon and Stolen String

题意:字符串之间同下标可以交换字母,找出丢失的字符串。
思路:暴力枚举,对于每一列,丢失前字母之和-丢失后字母之和=该列的字母。
代码:

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

const int N = 1e5+10;

int t;
int n,m;
int a[200];
string s[N],c[N];

int main(){
    cin>>t;
    while(t--){
        cin>>n>>m;
        for(int i=1; i <= n ; i++)  cin>>s[i];
        for(int i=1 ;i <= n-1; i++) cin>>c[i];
        
        int i=0;
        while(i < m){
            int sum=0,ans=0;
            for(int j=1; j <= n; j++){
                sum += s[j][i];
            }
            for(int j=1; j <= n-1; j++){
                ans += c[j][i];
            }
            cout<<(char) (sum - ans);
            i++;
        }
        cout<<endl;
    }
    return 0;
}

C-AquaMoon and Strange Sort

题意:排序之前所有人是向右的,相邻两人可以交换位置,交换后他们的方向也变化,判断是否满足从小到大排序之后所有人还是是向右的。
思路:所有人的交换次数一定是偶数才满足条件,分下标奇偶数讨论
代码:

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

const int N = 1e5+10;

int t,n;
int a[N],odd[N],even[N];

int main(){
    cin>>t;
    while(t--){
        cin>>n;
        memset(odd,0,sizeof odd);
        memset(even,0,sizeof even);
        for(int i = 1; i <= n; i++) cin>>a[i];
        for(int i = 1; i <= n; i++){
            if(i % 2) odd[a[i]]++;
            else even[a[i]]++;
        }
        sort(a+1,a+1+n);
        for(int i = 1; i <= n; i++){
            if(i % 2) odd[a[i]]--;
            else even[a[i]]--;
        }
        int flag=1;
        for(int i = 1; i <= n; i++){
            if(odd[a[i]] < 0 || even[a[i]] < 0){
                flag=0;
                break;
            }
        }
        if(flag) puts("Yes");
        else puts("No");
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值