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;
}