Codeforces Round #732 (Div. 2)

2 篇文章 0 订阅

A-AquaMoon and Two Arrays

题目

在这里插入图片描述
给出数列a、b,每次可以选取i,j,使得a[i]–,a[j]++.问是否能通过此操作使得a=b.(不需要使操作数最小)

直接暴力,记录c[i]=b[i]-a[i],如果 ∑ c n \sum c_{n} cn!=0,就输出-1;
然后对每个c[i],直到它等于0为止一直对其++或–,在数列中找到c[j]–或++。

#include <iostream>
#include <cstring>
#include <cmath>
#include <bitset>
#include <queue>
#include <vector>
#include <cstdio>
#include <queue>
#include <sstream>
#include <string>
#include <algorithm>
#include <map>
#define rep(i, a, b) for (ll i = a; i <= b; i++)
#define reps(i, a, b) for (int i = a; i >= b; i--)
#define mk make_pair
using namespace std;
const int N = 1e4 + 7;
const int M = 3e2+ 7;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
typedef long long ll;
struct Node{
    int i,j;
}ans[N];
int a[M],b[M],c[M];
int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n;
        int sum=0,cnt=0;
        scanf("%d",&n);
        rep(i,1,n)scanf("%d",&a[i]);
        rep(i,1,n){
            scanf("%d",&b[i]);
            c[i]=b[i]-a[i];
            sum+=c[i];
        }
        if(sum!=0)puts("-1");
        else {
            rep(i, 1, n){
                while (c[i]!=0) {
                    if (c[i] > 0) {
                        cnt++;
                        ans[cnt].j = i;
                        c[i]--;
                        rep(j, 1, n) {
                            if (c[j] < 0) {
                                ans[cnt].i = j;
                                c[j]++;
                                break;
                            }
                        }
                    } else if (c[i] < 0) {
                        cnt++;
                        ans[cnt].i = i;
                        c[i]++;
                        rep(j, 1, n) {
                            if (c[j] > 0) {
                                ans[cnt].j = j;
                                c[j]--;
                                break;
                            }
                        }
                    }
                }
            }
            printf("%d\n",cnt);
            rep(i,1,cnt){
                printf("%d %d\n",ans[i].i,ans[i].j);
            }
        }
    }
    return 0;
}

B-AquaMoon and Stolen String

题目

在这里插入图片描述
给出奇数个等长字符串,两两配对,配对的字符串可以交换字符,给出交换之后的n-1个字符串,问剩下的没有配对的字符串是哪个。

记录原字符串每个位置的每个字母出现次数,然后减去配对后字符串出现次数,剩下的就是没配对的

#include <iostream>
#include <cstring>
#include <cmath>
#include <bitset>
#include <queue>
#include <vector>
#include <cstdio>
#include <queue>
#include <sstream>
#include <string>
#include <algorithm>
#include <map>
#define rep(i, a, b) for (ll i = a; i <= b; i++)
#define reps(i, a, b) for (int i = a; i >= b; i--)
#define mk make_pair
using namespace std;
const int N = 1e5 + 7;
const int M = 3e2+ 7;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
typedef long long ll;
string a[N],b[N];
int c[N][27];
int main()
{
    int t;
    cin>>t;
    while (t--)
    {
        memset(c,0,sizeof c);
        int n,m;
        cin>>n>>m;
        rep(i,0,n-1){
            cin>>a[i];
            rep(j,0,a[i].size()-1){
                c[j][a[i][j]-'a']++;
            }
        }
        rep(i,0,n-2){
            cin>>b[i];
            rep(j,0,b[i].size()-1){
                c[j][b[i][j]-'a']--;
            }
        }
        rep(i,0,m-1){
            rep(j,0,25){
                if(c[i][j]==1)cout<<char(j+'a');
            }
        }
        puts("");
    }
    return 0;
}

C-AquaMoon and Strange Sort

题目

在这里插入图片描述
给出一个数列,开始每个元素方向向右,相邻元素可以互换位置,每次换位置方向都会反向,问是否能得到一个非递减的数列并且所有元素方向依然向右。

显然每个元素只能移动偶数次,记录每个数字在奇数位置的次数和偶数位置的次数,然后对数列排序,
再看看每个元素的奇数位置次数和偶数位置次数与之前是否相同,相同则输出YES不同则输出NO。

#include <iostream>
#include <cstring>
#include <cmath>
#include <bitset>
#include <queue>
#include <vector>
#include <cstdio>
#include <queue>
#include <sstream>
#include <string>
#include <algorithm>
#include <map>
#define rep(i, a, b) for (ll i = a; i <= b; i++)
#define reps(i, a, b) for (int i = a; i >= b; i--)
#define mk make_pair
using namespace std;
const int N = 1e5 + 7;
const int M = 3e2+ 7;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
typedef long long ll;
int a[N],b[N];
int even[N],odd[N];
int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        memset(even,0,sizeof even);
        memset(odd,0,sizeof odd);
        int n;
        scanf("%d",&n);
        int num=0;
        rep(i,1,n){
            scanf("%d",&a[i]);
            if(i%2)odd[a[i]]++;
            else even[a[i]]++;
            b[i]=a[i];
        }
        sort(b+1,b+1+n);
        rep(i,1,n){
            if(i%2)odd[b[i]]--;
            else even[b[i]]--;
        }
        bool is=0;
        rep(i,1,n){
            if(odd[b[i]]!=0||even[b[i]]!=0){
                puts("NO");
                is=1;
                break;
            }
        }
        if(!is)
        puts("YES");
    }
    return 0;
}

D - AquaMoon and Chess

题目
在这里插入图片描述
给出01串,对任意i,如果a[i]=1,a[i+1]=1,a[i+2]=0或者a[i-1]=1,a[i-2]=0,则a[i]可以和a[i-2],a[i+2]互换位置,问进行若干操作后可以有多少种情况。
显然11可以到任意位置,而单独的1不能动,可以忽略,所以问题就是求11串插入0之间的方案数 C n m C_{n}^{m} Cnm,n为0和11数的总和,m为11数。
组合数比较大,要取模。

#include <iostream>
#include <cstring>
#include <cmath>
#include <bitset>
#include <queue>
#include <vector>
#include <cstdio>
#include <queue>
#include <sstream>
#include <string>
#include <algorithm>
#include <map>
#define rep(i, a, b) for (ll i = a; i <= b; i++)
#define reps(i, a, b) for (int i = a; i >= b; i--)
#define mk make_pair
using namespace std;
const int N = 1e5 + 7;
const int M = 3e2+ 7;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
typedef long long ll;
char a[N];
ll f[N];
void init()
{
    f[0]=1;
    rep(i,1,1e5){
        f[i]=f[i-1]*i%mod;
    }
}
ll power(ll a,ll b)
{
    ll ans=1;
    while (b)
    {
        if(b&1){
            ans=ans*a%mod;
        }
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    init();
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n;
        int num1=0,num2=0,cnt=0;
        scanf("%d",&n);
        scanf("%s",a+1);
        rep(i,1,n){
            if(a[i]=='0'){
                num1++;
                num2+=cnt/2;
                cnt=0;
            }else{
                cnt++;
            }
        }
        num2+=cnt/2;
        printf("%lld\n",f[num1+num2]*power(f[num1]*f[num2]%mod,mod-2)%mod);
        //printf("%lld",f[num1+num2]/(f[num1]*f[num2]));
        //printf("%d %d\n",num1,num2);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值