Problem 77 Greedy Gift Givers

原创 2005年04月23日 14:26:00

Problem 108一样,Rob简化了这个问题,去掉了BT的测试数据,把问题限定在很小的范围之内,最多10个人,人名不超过14个字母,礼物价值在2000以内,不过这也OK啦,和Problem 108不同,前两个值对整个问题没有什么影响,就算用BT数据,也只是小把戏而已(因为不可能修改人名,弄个长达几十万个字母的名字一点意义都没有,除了增加保存的难度,和算法无关,不是USACO的宗旨,而且要是用cpp,有STL傍身,这种问题根本不会影响到程序)。所以,关注问题本身就可以了,不要太执着于次要的地方。我猜Rob一定收到很多这方面的complaints,嘿嘿

当初这道题目的描述不是很清楚,现在的版本Rob把很多小细节都解释出来了。比如整数除法的问题,我第一次遇到的时候着实郁闷了一下,明明dave给了200收了500,最后怎么会是302。因为每个人的实现会不一样,有的人的代码根本不会遇到这个怎么加减的问题。其实USACO的题目有时候不难,只是编码的时候很多小细节都不要忽视,不然会很不服气。(因为第一次提交就过关和超过一次过关的page会有点不同,虽然我是菜鸟,总归希望能一次过关啦,可要是因为这种非受迫性失误而不能一次过关,心里的感觉真不是窝囊两个字可以形容的@_#)。

本来是用map实现的,简单明了,可惜,map太热心了,它会自动帮你排序,而Rob要求你输出时和输入文件的人名顺序相同。E~~~-_-!其实我想要是换成vector<pair<string,int> >应该也是可以的吧。不过杀鸡焉用牛刀,效率又不比array高,还要多打几行代码,也罢,祭出array大法,直接用数组搞定。唯一比map麻烦的是要自己写一个查人名的函数,不像map可以直接key/value就定位了。

最后,再说一个不是人人遇得到得细节问题(又是detail。。。),其实在它给的样例数据里就有了:vick。这个家伙吝啬的一塌糊涂,只知道拿不知道给。想到什么了没?Yes,他一毛不拔岂不是意味着我在平分礼物的时候要除0!小心啊,同志们。陷阱~~~!那为什么有的人遇不到而我就遇到了呢,看我的代码,我把要分配的平均数事先算出来了,如果忘记check,在运行提交的时候就保准给你一闷棍。要是把这个除法放在后面的for loop里面,就可以避过这个问题了。本意是希望不要做重复劳动,结果好心办坏事 正应了那句"premature optimization is the root of all evil."啊

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int find(string[], string);

int main(){
 int np;
 string* group;
 int*    value;
 
 // get number of members in group
 ifstream fin("gift1.in");
 fin>>np;
 group = new string[np];
 value = new int[np];

 // get members' name
 for(int i = 0;i < np; ++i){
  string name;
  fin>>name;
  group[i] = name;
  value[i] = 0;
 }
 
 // for each member:
 for(int i = 0;i < np; ++i){
  string name;        // this member's name
  int    money,       // money he or she sets aside
         friendnum,   // number of friends is giving gift
         evennum,     // divide money evenly
         mypos;       // this member's position

  fin>>name>>money>>friendnum;
  
  // cheap guy:)
  if(friendnum)
      evennum = money / friendnum;
  
  mypos = find(group, name);
  
  // for every his or her friend:
  for(int j = 0;j < friendnum; ++j){
   string friendname;    // get friend name
   fin>>friendname;
   
   // find friend's position in container
   int frdpos = find(group, friendname);
   
   value[mypos] -= evennum;     // give gift
   value[frdpos] += evennum;    // get gift
  }
 }
 
 ofstream fout("gift1.out");
 for(int i = 0; i < np; ++i){
  fout<<group[i]<<" "<<value[i]<<endl;
 }
}

int find(string group[], string name){
 int i = 0;
 while(group[i] != name) i++;
 return i;
}

USACO 1.1 - Greedy Gift Givers(杂题)

A group of NP (2 ≤ NP ≤ 10) uniquely named friends hasdecided to exchange gifts of money. Each of th...

USACO-cha1-sec1.1 Greedy Gift Givers

Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gif...

USACO 1.1.2 Greedy Gift Givers

我的: 问题的难点是:题目的理解和名字的存储。 get[]存放的是得到的钱,money[]开始是送礼者原来钱数,然后存储送出的总钱数 这个题用文件在Code blocks上通不过但提交时就OK了...

USACO - Chapter1 Section 1.1 - Greedy Gift Givers

Greedy Gift Givers题目描述对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少。在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他...

1.1.2 Greedy Gift Givers

很简单一道题, 但是没弄清题意把我害惨了…… #include #include #include using namespace std; int main() { ofstr...

一大堆的福利之【USACO题库】Greedy Gift Givers贪婪的礼物送礼者

题目描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少(and vice versa for those who view gift giving with cynici...
  • sss_brs
  • sss_brs
  • 2017年03月29日 19:59
  • 213

我的第二个 USACO Training--Greedy Gift Givers

题目: A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts of money. Each...

usaco 1-1-2 Greedy Gift Givers

usaco 持续更新中。 nocow友情翻译: 描述 对于一群NP(2 [编辑]格式 PROGRAM NAME: gift1 INPUT FORMAT: (file gift1.i...

USACO->Greedy Gift Givers

USACO -> Greedy Gift Givers

Section 1.1 PROB Greedy Gift Givers

Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Problem 77 Greedy Gift Givers
举报原因:
原因补充:

(最多只允许输入30个字)