如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

USACO/gift1

来自"NOCOW"

跳转到: 导航, 搜索
这是USACO Chapter 1 .1中的OI题目Greedy Gift Givers介绍及题解,参见 翻译C语言代码C++语言代码Pascal语言代码

[编辑] 分析

这道题的难度相当于联赛第一题。 用数组incom outcom记录每个人的收入和支出,记录每个人的名字,对于送礼人i,找到他要送给的人j, inc(incom[j],outcom[i] div n),其中n是要送的人数,最后inc(incom[i],outcom[i] mod n) 最后输出incom[i]-outcom[i]即可。(复杂度O(n^3))

用Hash表可以进行优化,降复杂度为O(n^2)

PS:其实如果你用c++可以更好更快的解决问题,那就是STL中的map:

  1. include<iostream>
  1. include<fstream>
  1. include<string>
  1. include<map>


using namespace std;


int main()

{

string names[50];

map <string,int> reci,given;


int np;

ifstream cin("gift1.in");

ofstream cout("gift1.out");


cin>>np;

for (int i=1;i<=np;i++)

cin>>names[i];

for (int i=1;i<=np;i++)

{

string temp;

int tempr,tempg,j;


cin>>temp;

cin>>tempg>>j;

for (int k=1;k<=j;k++)

{

string temp2;


cin>>temp2;

reci[temp2]+=tempg/j;

given[temp]+=tempg/j;

}


}

for (int i=1;i<=np;i++)

cout<<names[i]<<" "<<reci[names[i]]-given[names[i]]<<endl;


return 0;

}

[编辑] 代码

pascal { ID:greenpz1 LANG:PASCAL TASK:gift1 } program gift1; var

 g:text;
 a,b:array[1..10]of integer;
 name:array[1..10]of string;
 t,n,j,x,y,c:integer;
 s:string;

function search(s:string):integer; var

 t:integer;

begin

 for t:=1 to n do
   if name[t]=s then begin 
     search:=t;
     break;
   end;

end;

begin

 assign(g,'gift1.in');
 reset(g);
 readln(g,n);
 for t:=1 to n do
   readln(g,name[t]);
 j:=0;
 repeat
   j:=j+1;
   readln(g,s);
   readln(g,x,y);
   c:=search(s);
   b[c]:=x;
   if x>0 then
     a[c]:=x mod y+a[c];
   if y>0 then
     for t:=1 to y do begin
       readln(g,s);
       c:=search(s);
       a[c]:=x div y+a[c];
     end;
 until j=n;
 close(g);
 assign(g,'gift1.out');
 rewrite(g);
 for t:=1 to n do
   writeln(g,name[t],' ',a[t]-b[t]);
 close(g);

end.

[编辑] 引用

[1]

[2]

个人工具