http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536
不知道为何怎么写都写不对.
这题可以模拟.
虽然题目保证一定可以从原串变成目标串,但是不一定可以变成两种目标串.
所以需要判断下.统计原串中0和1的个数,然后计算目标串中0可能的个数,1可能的个数.
计算交换次数就是从后面找一个跟当前不一样的数字交换到前面来即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<stdlib.h> 6 #include<algorithm> 7 using namespace std; 8 const int MAXN=20; 9 int a[MAXN],b[MAXN],num[MAXN],temp[MAXN],ans; 10 int main() 11 { 12 //freopen("a.txt","r",stdin); 13 int n,m,num0=0,num1=0,res1=0,res2=0; 14 int minn=0x3f3f3f3f; 15 scanf("%d %d",&n,&m); 16 for(int i=1; i<=n; i++) 17 { 18 scanf("%d",&a[i]); 19 if(a[i]==1) num1++; 20 if(a[i]==0) num0++; 21 } 22 // printf("%d %d ",num1,num0); 23 for(int i=1; i<=m; i++) 24 { 25 scanf("%d",&temp[i]); 26 if(i%2==1) res1+=temp[i]; 27 if(i%2==0) res2+=temp[i]; 28 } 29 //printf("%d %d ",res1,res2); 30 if(res1==num1) 31 { 32 ans=0; 33 memset(b,0,sizeof(b)); 34 int flag=1,cnt=1; 35 for(int i=1; i<=m; i++) 36 { 37 for(int j=1; j<=temp[i]; j++) 38 b[cnt++]=flag; 39 flag=!flag; 40 } 41 for(int i=1; i<=n; i++) 42 { 43 if(a[i]==b[i]) continue; 44 else 45 { 46 for(int j=i+1; j<=n; j++) 47 { 48 if(b[j]==!b[i]) 49 { 50 swap(b[j],b[i]); 51 ans+=j-i; 52 break; 53 } 54 } 55 } 56 } 57 minn=min(ans,minn); 58 } 59 if(res1==num0) 60 { 61 ans=0; 62 memset(b,0,sizeof(b)); 63 // for(int i=1;i<=n;i++) num[i]=a[i]; 64 int flag=0,cnt=1; 65 for(int i=1; i<=m; i++) 66 { 67 for(int j=1; j<=temp[i]; j++) 68 b[cnt++]=flag; 69 flag=!flag; 70 } 71 for(int i=1; i<=n; i++) 72 { 73 if(a[i]==b[i]) continue; 74 else 75 { 76 for(int j=i+1; j<=n; j++) 77 { 78 if(b[j]==!b[i]) 79 { 80 swap(b[j],b[i]); 81 ans+=j-i; 82 break; 83 } 84 } 85 } 86 } 87 minn=min(ans,minn); 88 } 89 printf("%d ",minn); 90 return 0; 91 }