题目来自NAIPC2018
直接模拟
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 bool check[100050]; 6 int uncheck[100050]; 7 int op[100050]; 8 int ans[100050]; 9 int main() 10 { 11 int n,m; 12 while(scanf("%d %d",&n,&m)!=EOF) 13 { 14 memset(check,0,sizeof(check)); 15 for(int i=1;i<=m;i++) 16 { 17 scanf("%d",&op[i]); 18 check[op[i]]=1; 19 } 20 int k=1; 21 for(int i=1;i<=n;i++) 22 { 23 if(check[i]==0) 24 { 25 uncheck[k++]=i; 26 } 27 } 28 k=1; 29 for(int i=1;i<=m;i++) 30 { 31 if(op[i]>uncheck[k]) 32 { 33 while(op[i]>uncheck[k]&&k<=n-m) 34 { 35 printf("%d\n",uncheck[k]); 36 k++; 37 } 38 } 39 printf("%d\n",op[i]); 40 } 41 for(;k<=n-m;k++) 42 { 43 printf("%d\n",uncheck[k]); 44 } 45 } 46 return 0; 47 }
输入两个字符串s,t分别代表行和列的状态(规定行或列中 1的个数为奇数 对应的是1,1的个数为偶数 对应的是0),求还原后的方阵。题目给出了两个条件:1、要求1的数量尽可能多;2、一次把每行接到上一行的后面,在条件1的前提下,使得衔接后的二进制数值最小(即让0尽量靠前)
如果行和列中1的个数奇偶性不同,直接输出-1。对于可以还原的,先把可以需要放0的行和列存下来(记需要放0的行数为rr,列数为cc)。如果rr>=cc,首先在需要放0的行中按从小到大的顺序找到( rr-cc )个行把这些行的第一个变为0;其次对于剩下的行,按列从小到大的顺序相应的都变为0,其余的都为1。如果rr<cc,同理
1 #include<bits/stdc++.h> 2 using namespace std; 3 int mp[60][60],a[60],b[60],aa[60],bb[60]; 4 char s[60],t[60]; 5 int main() 6 { 7 while(scanf("%s%s",s,t)!=EOF) 8 { 9 int r=strlen(s),c=strlen(t); 10 for(int i=0;i<r;i++) 11 a[i]=s[i]-'0'; 12 for(int i=0;i<c;i++) 13 b[i]=t[i]-'0'; 14 int rr=0,cc=0,cnt1=0,cnt2=0; 15 for(int i=0;i<r;i++) 16 { 17 if(c&1){ 18 if(!a[i]) aa[cnt1++]=i; 19 20 } 21 else{ 22 if(a[i]) aa[cnt1++]=i; 23 } 24 rr+=a[i]; 25 } 26 for(int i=0;i<c;i++) 27 { 28 if(r&1){ 29 if(!b[i]) bb[cnt2++]=i; 30 } 31 else{ 32 if(b[i]) bb[cnt2++]=i; 33 } 34 cc+=b[i]; 35 } 36 if((rr+cc)&1) 37 { 38 printf("-1\n"); 39 continue; 40 } 41 for(int i=0;i<r;i++) 42 for(int j=0;j<c;j++) 43 mp[i][j]=1; 44 if(cnt1<=cnt2) 45 { 46 for(int i=0;i<cnt2-cnt1;i++) 47 mp[0][bb[i]]=0; 48 for(int i=cnt2-cnt1;i<cnt2;i++) 49 mp[aa[i-cnt2+cnt1]][bb[i]]=0; 50 } 51 else 52 { 53 for(int i=0;i<cnt1-cnt2;i++) 54 mp[aa[i]][0]=0; 55 for(int i=cnt1-cnt2;i<cnt1;i++) 56 mp[aa[i]][bb[i-cnt1+cnt2]]=0; 57 } 58 for(int i=0;i<r;i++) 59 { 60 for(int j=0;j<c;j++) 61 printf("%d",mp[i][j]); 62 printf("\n"); 63 } 64 } 65 return 0; 66 } 67