双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意
注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N
(注意OJ上的数据存在问题:冒号后跟一个空格,CHARLES的话最后的句号‘.’应为半角,非全角)
1 /* 2 Written By StelaYuri 3 */ 4 #include<bits/stdc++.h> 5 using namespace std; 6 typedef pair<int,int> Par; 7 typedef pair<int,Par> Pr; 8 int M,N,P,ans,f[25]; 9 char s1[300],s2[300],s3[300]; 10 string dayStr[7]={ 11 "Monday" 12 ,"Tuesday" 13 ,"Wednesday" 14 ,"Thursday" 15 ,"Friday" 16 ,"Saturday" 17 ,"Sunday" 18 }; 19 vector<string> name; 20 map<string,int> mp; 21 Pr prd[105]; 22 inline int readDigit(){ 23 int x=0;char c=getchar(); 24 while(!isdigit(c))c=getchar(); 25 for(;isdigit(c);c=getchar())x=x*10+c-‘0‘; 26 return x; 27 } 28 inline void readName(){ 29 char c;int i=0; 30 while((c=getchar())!=‘\n‘)s1[i++]=c; 31 s1[i]=‘\0‘; 32 } 33 inline void readSubj(){ 34 char c;int i=0; 35 while((c=getchar())!=‘ ‘)s2[i++]=c; 36 s2[i-1]=‘\0‘; 37 } 38 inline void readWords(){ 39 char c;int i=0; 40 while((c=getchar())!=‘\n‘)s3[i++]=c; 41 s3[i]=‘\0‘; 42 } 43 int main(){ 44 int i,j,day,gty,fake,neutral,subid; 45 string sd; 46 bool jd,prim; 47 M=readDigit(); 48 N=readDigit(); 49 P=readDigit(); 50 for(i=0;i<M;i++){ 51 readName(); 52 name.push_back(s1); 53 mp[s1]=i; 54 } 55 for(i=0;i<P;i++){ 56 readSubj(); 57 readWords(); 58 sd=s3; 59 subid=mp[s2]; 60 if(sd=="I am guilty.") 61 prd[i]=Pr(1,Par(subid,subid)); 62 else if(sd=="I am not guilty.") 63 prd[i]=Pr(2,Par(subid,subid)); 64 else{ 65 jd=false; 66 for(j=0;!jd&&j<7;j++) 67 if(sd=="Today is "+dayStr[j]+"."){ 68 prd[i]=Pr(3,Par(subid,j)); 69 jd=true; 70 break; 71 } 72 for(j=0;!jd&&j<M;j++){ 73 if(sd==name[j]+" is guilty."){ 74 prd[i]=Pr(1,Par(subid,j)); 75 jd=true; 76 break; 77 } 78 else if(sd==name[j]+" is not guilty."){ 79 prd[i]=Pr(2,Par(subid,j)); 80 jd=true; 81 break; 82 } 83 } 84 if(!jd) 85 prd[i]=Pr(4,Par(0,0)); 86 } 87 } 88 for(jd=false,day=0;day<7;day++){ 89 for(gty=0;gty<M;gty++){ 90 memset(f,0,sizeof f); 91 prim=true; 92 for(i=0;i<P;i++){ 93 if(prd[i].first==1){ 94 if(prd[i].second.second==gty){ 95 if(!f[prd[i].second.first]) 96 f[prd[i].second.first]=1; 97 else if(f[prd[i].second.first]==2){ 98 prim=false; 99 break; 100 } 101 } 102 else{ 103 if(!f[prd[i].second.first]) 104 f[prd[i].second.first]=2; 105 else if(f[prd[i].second.first]==1){ 106 prim=false; 107 break; 108 } 109 } 110 } 111 else if(prd[i].first==2){ 112 if(prd[i].second.second!=gty){ 113 if(!f[prd[i].second.first]) 114 f[prd[i].second.first]=1; 115 else if(f[prd[i].second.first]==2){ 116 prim=false; 117 break; 118 } 119 } 120 else{ 121 if(!f[prd[i].second.first]) 122 f[prd[i].second.first]=2; 123 else if(f[prd[i].second.first]==1){ 124 prim=false; 125 break; 126 } 127 } 128 } 129 else if(prd[i].first==3){ 130 if(prd[i].second.second==day){ 131 if(!f[prd[i].second.first]) 132 f[prd[i].second.first]=1; 133 else if(f[prd[i].second.first]==2){ 134 prim=false; 135 break; 136 } 137 } 138 else{ 139 if(!f[prd[i].second.first]) 140 f[prd[i].second.first]=2; 141 else if(f[prd[i].second.first]==1){ 142 prim=false; 143 break; 144 } 145 } 146 } 147 } 148 if(!prim) 149 continue; 150 neutral=fake=0; 151 for(i=0;i<M;i++) 152 if(f[i]==0) 153 neutral++; 154 else if(f[i]==2) 155 fake++; 156 if(fake<=N&&fake+neutral>=N){ 157 if(!jd){ 158 jd=true; 159 ans=gty; 160 } 161 else if(jd&&ans!=gty){ 162 puts("Cannot Determine"); 163 return 0; 164 } 165 } 166 } 167 } 168 if(jd) 169 puts(name[ans].data()); 170 else 171 puts("Impossible"); 172 173 return 0; 174 }
原文地址:https://www.cnblogs.com/stelayuri/p/12233440.html
时间: 2024-11-09 03:12:33