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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值