40pts WA1,3,5
查看原帖
40pts WA1,3,5
546086
Francais_Drake楼主2021/10/5 20:17
#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;
}

我觉得这样写没什么错呀

2021/10/5 20:17
加载中...