USACO1.1.2 - Greedy Gift Givers

举报
小哈里 发表于 2022/05/11 00:02:50 2022/05/11
【摘要】 贪婪礼品送货员 一组NP(2≤NP≤10)唯一命名的朋友决定交换礼物的钱。这些朋友中的每一个可能或可能不会给任何或所有其他朋友一些钱。同样,每个朋友可能或可能不从任何或所有其他朋友接收钱。你在这个问题上的目标是推断每个人给予的收入多少。 赠送礼物的规则可能与您的期望不同。每个人都留出一定数量的钱来给予这笔钱,并将其平均分配...

贪婪礼品送货员

一组NP(2≤NP≤10)唯一命名的朋友决定交换礼物的钱。这些朋友中的每一个可能或可能不会给任何或所有其他朋友一些钱。同样,每个朋友可能或可能不从任何或所有其他朋友接收钱。你在这个问题上的目标是推断每个人给予的收入多少。

赠送礼物的规则可能与您的期望不同。每个人都留出一定数量的钱来给予这笔钱,并将其平均分配给他或她给予礼物的所有人。没有分数钱是可用的,所以在2个朋友之间的3分别为1,剩下1个的朋友 - 剩下的1留在送礼者的“帐户”。

在任何一群朋友中,有些人比别人更多的捐赠(或者至少可能有更多的熟人),有些人比他人有更多的钱。

给定一群朋友,没有一个人的姓名长于14个字符,群体中的每个人花费在礼物上,以及每个人给予礼物的朋友的(子)列表,确定多少(或多少)少)组中的每个人给予他们。

重要的提示

分级机是使用标准Unix约定的Linux机器:行尾是一个通常称为“\ n”的单个字符。这与Windows不同,后者用两个字符'\ n'和'\ r'结束行。不要让你的程序被这个困住!

程序名称:gift1

输入格式

第1行: 单个整数,NP
线2..NP + 1: 每行包含组成员的名称
线NP + 2..end: NP组的线组织如下:
组中的第一行告诉人的姓名谁将给予礼物。
该组中的第二行包含两个数字:货币的初始金额(范围0..2000)由送礼者,然后人数量分成礼物给谁送礼者会送礼物,NG ( 0≤NG  ≤NP-1)。
如果异常不为零,每下一次NG的行列出礼物的接受者的名字。

SAMPLE INPUT(file gift1.in)

5
dave
劳拉
欧文
vick
amr
dave
200 3
劳拉
欧文
vick
欧文
500 1
dave
amr
150 2
vick
欧文
劳拉
0 2
amr
vick
vick
0 0

输出格式

输出是NP行,每个都有一个人的名称,后跟一个空白,然后是该人的净收益或损失(final_money_value - initial_money_value)。名称应以从输入的第2行开始出现的相同顺序打印。

所有礼物都是整数。每个人给予给予任何钱的每个朋友相同的整数金额,并且尽可能多地满足该约束。任何没有给予的钱都由提供者保存。

SAMPLE OUTPUT(file gift1.out)

dave 302
劳拉66
欧文-359
vick 141
amr -150

输出说明

五个名字:dave,laura,owen,vick,amr让我们保留每个人的货币表格:

dave 劳拉 欧文 vick amr
0 0 0 0 0
首先,'dave'在'laura','owen'和'vick'中分裂200。那到达66每个,剩下2
-200 + 2 66 66 66 0
第二,“欧文”给了500给“dave”:
-198 +500 66 66 -500 66 0
第三,'amr'在'vick'和'owen'之间分割150:
302 66 -434 +75 66 +75 -150
第四,'laura'在'amr'和'vick'之间分割0; 没有变化:
302 66 -359 141 -150
最后,'vick'给出0到没有人:
dave 劳拉 欧文 vick amr
302 66 -359 141 -150

开始题目看错了,写了好几遍,换了好多种写法



  
  1. //有BUG,23行编译不通过a/=b,a%b等无法计算;
  2. //SIGFPE: Arithmetic exception
  3. /*
  4. ID:gwj11391
  5. LANG:C
  6. TASK:gift1
  7. */
  8. #include<stdio.h>
  9. #include<string.h>
  10. int main(){
  11. FILE* fin = fopen("gift1.in","r");
  12. FILE* fout = fopen("gift1.out","w");
  13. int T, i, j, k, a, b;
  14. int NP_Pay[12] = {0};
  15. char NP[12][16], NG[16];
  16. fscanf(fin,"%d",&T);
  17. for(i = 1; i <= T; i++)
  18. fscanf(fin,"%s",NP[i]);
  19. for(k = 1; k <= T; k++){
  20. fscanf(fin,"%s",NG);
  21. fscanf(fin,"%d %d",&a, &b);
  22. for(i = 1; strcmp(NG,NP[i]); i++);//i <= T但是应该不会出现没有配对名字的情况
  23. NP_Pay[i] -= a;
  24. if(a%b == 0)a /= b;else{
  25. NP_Pay[i] += a%b;
  26. a = (a - a%b)/b;
  27. }
  28. for(j = 1; j <= b; j++){
  29. fscanf(fin,"%s",NG);
  30. for(i = 1; strcmp(NG,NP[i]); i++);
  31. NP_Pay[i] += a;
  32. }
  33. }
  34. for(i = 1; i <= T; i++)
  35. fprintf(fout,"%s %d\n",NP[i],NP_Pay[i]);
  36. return 0;
  37. }




  
  1. //C语言版本2,较长,其他OJ,已AC,未改文件输入输出
  2. //取模计算,函数,结构
  3. /*
  4. ID:gwj11391
  5. LANG:C
  6. TASK:gift1
  7. */
  8. #include<stdio.h>
  9. #include<string.h>
  10. struct{
  11. char name[20];
  12. int money;
  13. }giver[11];
  14. int solve(int);
  15. int main(){
  16. //freopen("gift1.in","r",stdin);
  17. //freopen("gift1.out","w",stdout);
  18. int NP;
  19. scanf("%d",&NP);
  20. for(int i = 0; i < NP; i++){
  21. scanf("%s",giver[i].name);
  22. giver[i].money = 0;
  23. }
  24. for(int sx = 0; sx < NP; sx++)solve(NP);
  25. for(int l = 0; l < NP; l++)
  26. printf("%s %d\n",giver[l].name,giver[l].money);
  27. return 0;
  28. }
  29. int solve(int NP){
  30. char owner[20];
  31. int give_position,owner_position;
  32. scanf("%s",owner);
  33. for(int i = 0; i < NP; i++){
  34. if(!strcmp(owner,giver[i].name)){
  35. give_position = i;
  36. }
  37. }
  38. //___________________________
  39. int a, b;
  40. scanf("%d %d",&a, &b);
  41. //------------
  42. if(a != 0){
  43. giver[give_position].money -= a;
  44. if(a%b == 0)a /= b;else{
  45. giver[give_position].money += a%b;
  46. a = (a-(a%b))/b;
  47. }
  48. }
  49. //------------
  50. for(int j = 0; j < b; j++){
  51. scanf("%s",owner);
  52. if(a != 0){
  53. for(int k = 0; k < NP; k++){
  54. if(!strcmp(owner,giver[k].name)){
  55. owner_position = k;
  56. }
  57. }
  58. //printf("%d %d\n",give_position,owner_position);
  59. giver[owner_position].money += a;
  60. }
  61. }
  62. }

//USACO已AC
 

  
  1. /*
  2. ID:gwj11391
  3. LANG:C++
  4. TASK:gift1
  5. */
  6. #include<iostream>
  7. #include<fstream>
  8. #include<string>
  9. using namespace std;
  10. ifstream fin("gift1.in");
  11. ofstream fout("gift1.out");
  12. struct{
  13. string name;
  14. int money;
  15. }giver[11];
  16. int get_name(void){
  17. int T;
  18. fin>>T;
  19. for(int i = 0; i<T; i++){
  20. fin>>giver[i].name;
  21. giver[i].money = 0;
  22. }
  23. return T;
  24. }
  25. int main(){
  26. //-----------------------
  27. int NP; //all name's number
  28. NP = get_name();
  29. //do--------------------
  30. for(int i = 0; i<NP; i++){//每个人都送且只送一次礼物
  31. int a,b,t;
  32. string NG;
  33. fin>>NG; //This name
  34. fin>>a>>b; //recipient's money and people
  35. //find giver
  36. for(t = 0; t<NP; t++)
  37. if(giver[t].name == NG)
  38. break;
  39. //every
  40. for(int j = 0; j<b; j++){
  41. fin>>NG;
  42. //find recipient
  43. for(int k = 0; k<NP; k++){
  44. if(giver[k].name==NG){
  45. giver[k].money += a/b;
  46. giver[t].money -= a/b;
  47. }
  48. }
  49. }
  50. }
  51. //Date out
  52. for(int i = 0; i < NP; i++)
  53. fout<<giver[i].name<<" "<<giver[i].money<<endl;
  54. return 0;
  55. }





文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/54835683

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。