CodeforcesRound#732(Div2)-ABC

A-AquaMoon and Two Arrays

题意:
给你两个数组a和b,可以选择任意次下标i,j,然后ai-1,bj+1,问你是否能保证a数组=b数组,可以的话,请输出移动方案。
思路:
暴力,直接先判断需要±的数字大小是否相同,相同的话,直接双指针将两个数组±排序进行输出方案。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1100;
ll a[N],b[N];
struct node
{
    int id,x;
}s[N],d[N];//+,-
bool cmp(node x1,node x2)
{
    return x1.x<x2.x;
}
int main ()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll t;
    cin>>t;
    while(t--)
    {
       ll n;cin>>n;
       for(int i=1;i<=n;i++){
         cin>>a[i];
       }
       for(int i=1;i<=n;i++){
         cin>>b[i];
       }
       int cnt1=0,cnt2=0;
       ll sum1=0,sum2=0;
       for(int i=1;i<=n;i++){
           if(a[i]<b[i]){
              ++cnt1;
              s[cnt1].id=i;s[cnt1].x=b[i]-a[i];
              sum1+=b[i]-a[i];
           }
           else if(a[i]>b[i]){
               ++cnt2;
               d[cnt2].id=i;d[cnt2].x=a[i]-b[i];
               sum2+=a[i]-b[i];
           }
       }
       if(sum1==sum2){
        sort(s+1,s+1+cnt1,cmp);
        sort(d+1,d+1+cnt2,cmp);
        cout<<sum1<<endl;
        for(int i=1,j=1;i<=cnt1||j<=cnt2;)
        {
            if(s[i].x>0&&d[j].x>0){
                cout<<d[j].id<<" "<<s[i].id<<endl;
                s[i].x--;d[j].x--;
            }
            else if(s[i].x<=0)
            {
                i++;
            }
            else if(d[j].x<=0)
            {
                j++;
            }
        }
       }
       else{
        cout<<-1<<endl;
       }

    }
    return 0;
}

B. AquaMoon and Stolen String

题意:
给你两个字符串数组,一个长度为n,一个长度为n-1,因为它两两配对打乱顺序,然后去输出那个没有被配对打乱的字符串,
思路:
写的时候,当时把map用的有点恶心,才发现想复杂了,可以按照每一列的字母个数来找,我们直接把字母个数差一个的字母输出为答案就可以了,就可以去解决它一个字符串出现多次的问题。(被交互式给唬了一下)
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+7;
map<char,int>mp[N],mm[N];//每一列字母出现次数,
int n,m;
int main ()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    //cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
       
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            mp[i].clear();mm[i].clear();
        }
        for(int i=1; i<=n; i++)
        {
            for(int j=1;j<=m;j++){
                char ch;cin>>ch;//这种方式来直接存储每一列字母的个数,就不用字符串数组存取在进行循环了
                mp[j][ch]++;
            }
        }
        for(int i=1; i<=n-1; i++)
        {
            for(int j=1;j<=m;j++){
                char ch;cin>>ch;
                mm[j][ch]++;
            }
        }
        string ans="";
        for(int i=1;i<=m;i++)
        {
            for(char j='a';j<='z';j++){//可以这么循环字符串,就不用遍历n-1便,要不循环可能会爆了。
                if(mp[i][j]-mm[i][j]==1){
                    ans+=j;
                    break;
                }
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}

C. AquaMoon and Strange Sort

题意:
给你两个数组a和b,开始他们的方向都是r,可以跟左右字母所交换,同时交换方向(r->l//l->r),问无限次交换后可不可以不递减的排序且方向都是r。
思路:
这个字符串的当前位置跟不递减的原本位置交换的得交换偶数次才可以保证方式最后都是r,奇数位置去换奇数位置,偶数位置去换偶数位置才可以保证,因为有相同的ai,所以我们去存储判断奇偶的次数,每次次数–,就不用去判断到底是哪个位置去交换。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+7;
ll a[N],b[N][4];
int main ()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    ll t;
    cin>>t;
    while(t--)
    {
        memset(b,0,sizeof b);
        ll n;cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            b[a[i]][i%2]++;
        }
        sort(a+1,a+1+n);
        int f=0;
        for(int i=1;i<=n;i++){
            if(b[a[i]][i%2]>0)
            {
                b[a[i]][i%2]--;
            }
            else{
                f=1;break;
            }
        }
        if(f==1) cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值