这一题挺简单的,但是如果是纯模拟的话。会十分麻烦
这里介绍一个\(STL\)映射\(map\)
\(map\)的最大优点是可以使用任意数据类型作为数组的下标
\(map\)的定义形式为 map< 下标类型 , 存放的数据类型 > 数组名
如: \(map<string ,int >ans\)
\(map\)的使用方法与普通数组无异
\(map\)数组中值默认为\(0\)
此题所需注意的点
贪婪者送出去的钱是要减去的
x%y&&y!=0 否则会 \(RE\)
#include "bits/stdc++.h"
using namespace std;
int n,num,money;
string name[11];
map<string,int>ans;//map定义
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++)
cin>>name[i];
for(int i=1;i<=n;i++) {
string na;
cin>>na>>money>>num;
ans[na]-=money;//先减去,反正后面不能分完会加回来
if(!num) {//特判 被模数
if(money)
ans[na]+=money;//如果有钱,收入自己囊中
continue;
}
if(!money)//没钱,免谈!!!
continue;
if(money%num)//判断是否有剩余
ans[na]+=(money%num),money-=(money%num);
for(int j=1;j<=num;j++)
cin>>na,ans[na]+=(money/num);//把分出去的钱加上收礼者的数组里
}
for(int i=1;i<=n;i++)
cout<<name[i]<<‘ ‘<<ans[name[i]]<<endl;//输出
return ac;
}
手动防抄袭
题解 P1201 【[USACO1.1]贪婪的送礼者Greedy Gift Givers】
原文:https://www.cnblogs.com/Hitocoko/p/13376531.html