#include <bits/stdc++.h>
using namespace std;
int m,n,j,dp;
struct item{
string name;
int num;
int maxnum;
int value;
bool equal(const item &a){
return a.name==name&&a.maxnum==maxnum&&a.value==value;
}
bool operator <(const item &a){
return num*value>a.num*a.value;
}
item operator =(const item &a){
name=a.name;
num=a.num;
maxnum=a.maxnum;
value=a.value;
return *this;
}
}I[134500];//考虑n=100,a[i]均为1344而c[i]均为1的极端情况
struct item tmp;
bool merge(const struct item &a,int v){
for(register short i=0;i<v;i++){
if(I[i].equal(a)){
I[i].num+=a.num;
return true;
}
}
return false;
}
void divide(){
for(register short i=0;i<n;i++){
if(I[i].num>I[i].maxnum){
I[++n].num=I[i].num-I[i].maxnum;
I[i].num-=I[i].maxnum;
}
}
}
int main(){
scanf("%d%d",&m,&n);
for(register short i=0;i<n;i++){
scanf("%d%d%d",&tmp.num,&tmp.value,&tmp.maxnum);
cin >> tmp.name;
if(!merge(tmp,i)) I[++j]=tmp;
}
divide();
sort(I,I+n);
for(register unsigned short i=0;i<=21-m;i++) dp+=I[i].num*I[i].value;
printf("%d\n",dp);
return 0;
}
我觉得这样写没什么错呀