[USACO] Section1.1 Greedy Gift Givers[线性时间查找]

来源:互联网 发布:mysql server 5.5安装 编辑:程序博客网 时间:2024/05/24 00:36

2017-5-23
题目大意:

对于一群(NP个)(2<=NP<=10)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少。 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。 然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。 给出一群朋友,没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表, 请确定每个人收到的比送出的钱多的数目。

样例输入:

5
dave
laura
owen
vick
amr
dave
200 3
laura
owen
vick
owen
500 1
dave
amr
150 2
vick
owen
laura
0 2
amr
vick
vick
0 0

样例输出:

dave 302
laura 66
owen -359
vick 141
amr -150

题解:

这个题目因为数据量小,而且我也不懂数据结构,就用的线性时间查找,时间是够的,但是一直忽略了被除数不能为 0 的问题,所以好长时间没有AC。该长点心眼了。
学长讲了个map和 C11 hash 两种方法,听的也不是太明白。可能是有点蠢。。。
http://blog.csdn.net/yoer77/article/details/72568920学长的博客以供参考。

代码:

C++/*ID:mujinui1PROG:gift1LANG:C++*/#include<iostream>#include<fstream>#include<cstring> using namespace std;int main(){    ofstream fout ("gift1.out");    ifstream fin ("gift1.in");    string s[10];    string s1,s2;    int a[10];     int n,i,j,k,mo,num,ave;      memset(a,0,sizeof(a));    fin>>n;       for(i=0;i<n;i++){        fin>>s[i];    }       for(i=0;i<n;i++){        fin>>s1>>mo>>num;        if(num!=0){             for(j=0;s1!=s[j];j++);          ave=mo/num;             a[j]=a[j]-num*ave;              for(k=0;k<num;k++){            fin>>s2;            for(j=0;s2!=s[j];j++);            a[j]+=ave;        }    }    if(num==0){  **//防止被除数为0**        for(j=0;s1!=s[j];j++);                  a[j]=a[j];    }}    for(i=0;i<n;i++){        fout<<s[i]<<' '<<a[i]<<endl;    }    return 0;}