题目链接:点击打开链接
题目大意:略。
解题思路:略。
AC 代码
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); #define INF 0x3f3f3f3f #define MOD 1000000007 using namespace std; typedef long long ll; int mp[110][10], scrr[110], okrr[110]; unordered_map<char,int> ump[110]; int main() { char c; int n,m,sc,selNum,okNum,flag=1; scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d%d",&sc,&selNum,&okNum); scrr[i]=sc; okrr[i]=okNum; for(int j=0;j<okNum;j++) { scanf(" %c",&c); ump[i][c-'a']=1; mp[i][c-'a']=n; // 应该要有 n 人选它 } } getchar(); for(int i=0;i<n;i++) { double sum=0; for(int j=0;j<m;j++) { getchar(); // '(' int f=1,cnt=0; scanf("%d",&selNum); for(int q=0;q<selNum;q++) { scanf(" %c",&c); if(ump[j][c-'a']!=1) { f=0; mp[j][c-'a']++; // 选错了 } else { cnt++; mp[j][c-'a']--; // 选对了 } } getchar(); // ')' getchar(); // ' ' or '\n' if(f) { if(cnt==okrr[j]) sum+=scrr[j]; else sum+=scrr[j]/2.0, flag=0; // 保证学生至少选一个 } else flag=0; } printf("%.1f\n",sum); } // 不用sort来做,因为数据比较小,这样更方便 int ma=INT_MIN; for(int i=0;i<m;i++) for(int j=0;j<5;j++) ma=max(ma,mp[i][j]); if(flag) puts("Too simple"); for(int i=0;i<m && !flag;i++) for(int j=0;j<5;j++) { if(ma==mp[i][j]) printf("%d %d-%c\n",ma,i+1,char(j+'a')); } return 0; }