模拟,注意没有涂的情况
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<vector> 5 #include<cstring> 6 #include<algorithm> 7 #define N 100005 8 using namespace std; 9 struct node { 10 string name; 11 int score; 12 } e[N]; 13 bool cmp(const node&a,const node &b) { 14 if(a.score==b.score)return a.name<b.name; 15 return a.score>b.score; 16 } 17 struct T { 18 int comp,part; 19 bool ans[5]; 20 } t[N]; 21 int main() { 22 freopen("sheet.in","r",stdin); 23 freopen("sheet.out","w",stdout); 24 int n,m; 25 cin>>n>>m; 26 for(int i=1; i<=n; i++) { 27 cin>>e[i].name; 28 } 29 for(int i=1; i<=m; i++) { 30 cin>>t[i].comp>>t[i].part; 31 string answer; 32 cin>>answer; 33 for(int j=0; j<answer.size(); j++) { 34 t[i].ans[answer[j]-'A'+1]=1; 35 } 36 } 37 for(int o=1; o<=n; o++) { 38 string temp[5]; 39 for(int i=1; i<=4; i++) { 40 cin>>temp[i]; 41 temp[i]=' '+temp[i]; 42 } 43 int tempans[5]; 44 int score=0; 45 for(int i=1; i<=m; i++) { 46 memset(tempans,0,sizeof tempans); 47 for(int j=1; j<=4; j++) { 48 if(temp[j][i]=='X') { 49 tempans[j]=1; 50 } 51 } 52 int flag=0; 53 for(int j=1; j<=4; j++) { 54 if(t[i].ans[j]==tempans[j])continue; 55 if(t[i].ans[j]==1&&tempans[j]==0) { 56 flag=1; 57 continue; 58 } else { 59 flag=2; 60 break; 61 } 62 } 63 int sum=0; 64 for(int i=1;i<=4;i++)sum+=tempans[i]; 65 if(sum==0)flag=2; 66 if(flag==0)score+=t[i].comp; 67 if(flag==1)score+=t[i].part; 68 else continue; 69 } 70 e[o].score=score; 71 } 72 sort(e+1,e+n+1,cmp); 73 for(int i=1; i<=n; i++) { 74 cout<<e[i].name<<" "<<e[i].score<<' '; 75 } 76 return 0; 77 }
over