11205--The broken pedometer

 

///暴力求解,先生成p的子集,然后逐个子集判断,每个子集均为1和0的序列 ///为1时表示选这个位,否则为不选。则问题化简为求含有最少个1的子集,并保证只观察 ///1所在的位时,输入的n个序列不会重复 ///题目的测试数据不是很严密,如输入1 1 1 0时有的得到0却仍然能通过, ///这主要是没有注意到答案至少为1不可能为0 #include<string.h> #include<stdlib.h> #include<iostream> using namespace std; #define LOCAL char s[110][20]; char temp[110][20]; int vis[20]; int flag[20]; int min1=20; int cmp(const void* _a,const void* _b) { char* a=(char*)_a; char* b=(char*)_b; return strcmp(a,b); } int decide(int p,int n) { int i,j; int cou=0; memcpy(temp,s,sizeof(s)); for(i=0;i<p;i++) if(vis[i]==1) cou++; else for(j=0;j<n;j++) temp[j][i]='0'; ////cout<<"~~~~"<<cou<<endl; qsort(temp,n,sizeof(temp[0]),cmp); for(i=0;i<n-1;i++) if(strcmp(temp[i],temp[i+1])==0) return 0; if(cou<min1&&cou!=0) min1=cou; return 0; } int subset(int p,int cur,int n) { if(cur==p) decide(p,n); else { vis[cur]=1; subset(p,cur+1,n); vis[cur]=0; subset(p,cur+1,n); } return 0; } int main() { #ifdef LOCAL freopen("in3.txt","r",stdin); freopen("out.txt","w",stdout); #endif int cas; cin>>cas; while(cas--) { min1=20;////全局变量每次使用时都要重新赋值,否则会与上次冲突 int p,n,i,j; cin>>p>>n; for(i=0;i<n;i++) { for(j=0;j<p;j++) { cin>>s[i][j]; } s[i][j]='/0'; } subset(p,0,n); cout<<min1<<endl; } return 0; }

你可能感兴趣的:(11205--The broken pedometer)