您的位置:首页 > 编程语言 > C语言/C++

USACO Section 1.2 Greedy Gift Givers (简单查找)

2017-05-21 15:39 330 查看
2018-3-25 changed

题目大意就是说我们要互相 ” 送钱 ” ,一共NP个人,指定某一个人将sum这么多的钱分给num个人,那么这些人每个人多了sum/num,送钱的那个人减少了sum,但是由于我们要保证每个人分到的钱都是整数,所以没有被整除的那一部分又回来了。如果说分给了0个人,则不做处理,继续输入。

主要是根据名字找到所在位置,然后改变对应的数值

法一:线性查找

/*
ID: 18795871
PROG: gift1
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;

ifstream fin("gift1.in");
ofstream fout("gift1.out");

const int N = 10;
char name[N+1][15];
int mon[N+1];
int n;

int getIndex(char *p){
for (int i=0;i<n;i++){
if (strcmp(name[i],p)==0) return i;
}
}

int main(){
int i,j;
while (fin>>n){
memset(mon,0,sizeof(mon));
for (i=0;i<n;i++){
fin>>name[i];
}
char t[15],k[15];
int sum,num,ave,giv;
while (fin>>t>>sum>>num){
if (num==0) continue;
ave=sum/num;
giv=sum-ave*num;
mon[getIndex(t)]+=(giv-sum);
for (j=0;j<num;j++){
fin>>k;
mon[getIndex(k)]+=ave;
}
}
for (i=0;i<n;i++){
fout<<name[i]<<" "<<mon[i]<<endl;
}
}
return 0;
}


法二:map键值对应

/*
ID: 18795871
PROG: gift1
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
#include<map>
using namespace std;

ifstream fin("gift1.in");
ofstream fout("gift1.out");

const int N = 10;
string name[N+1];
int n;

int main(){
int i,j;
string tmp;
while (fin>>n){
map<string,int>myMap;
for (i=0;i<n;i++){
fin>>name[i];
myMap[name[i]]=0;
}
int sum,num,ave,giv;
while (fin>>tmp>>sum>>num){
if (num==0) continue;
ave=sum/num;
giv=sum-ave*num;
myMap[tmp]+=(giv-sum);
for (j=0;j<num;j++){
fin>>tmp;
myMap[tmp]+=ave;
}
}
for (i=0;i<n;i++){
fout<<name[i]<<" "<<myMap[name[i]]<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++