题目链接:点击打开链接
题目大意:略。
解题思路:略。
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;
}