输入n个数(0或1),问是否能通过若干次交换相间的两个数字使得所有1都相邻。
解法:
当n为奇数时任意两个数字都能交换,当然是yes。
当n为偶数时相间的两数字可以互相交换,这样会出现两组排列,然后把排列a插入排列b。并且b的相邻两个元素间只能插一个a的元素。要使所有的1相邻,显然a,b中1的个数要么相等,要么相差1。因此直接判定yes或no
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; int num[50]; int main() { int n,t; scanf("%d",&t); while(t--){ int cnt=0; memset(num,0,sizeof(num)); scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&num[i]); if(num[i]==1){ cnt++; } } if(n%2==1){ printf("YES\n"); } else{ int realcnt=0; bool flag=false; for(int i=0;i<n;i+=2){ if(num[i]==1){ realcnt++; } } if(abs(cnt-2*realcnt)<2){ flag=true; //break; } //cout<<realcnt<<endl; if(flag){ printf("YES\n"); } else{ printf("NO\n"); } } } return 0; }
时间: 2024-10-23 04:32:54