【USACO題庫】 Greedy Gift Givers貪婪的禮物送禮者c++

hymcr05發表於2024-08-15


題目描述:

對於一群要互送禮物的朋友,你要確定每個人送出的禮物比收到的多多少(and vice versa for those who view gift giving with cynicism)。

在這一個問題中,每個人都準備了一些錢來送禮物,而這些錢將會被平均分給那些將收到他的禮物的人。

然而,在任何一群朋友中,有些人將送出較多的禮物(可能是因為有較多的朋友),有些人有準備了較多的錢。

給出一群朋友, 沒有人的名字會長於 14 字元,給出每個人將花在送禮上的錢,和將收到他的禮物的人的列表,

請確定每個人收到的比送出的錢多的數目。

輸入

第 1 行: 人數NP,2<= NP<=10
第 2到 NP+1 行: 這NP個在組裡人的名字 一個名字一行
第NP+2到最後: 這裡的NP段內容是這樣組織的: 第一行是將會送出禮物人的名字。 第二行包含二個數字: 第一個是原有的錢的數目(在0到2000的範圍裡),第二個NGi是將收到這個送禮者禮物的人的個數 如果 NGi 是非零的, 在下面 NGi 行列出禮物的接受者的名字,一個名字一行。
輸出

輸出 NP 行

每行是一個的名字加上空格再加上收到的比送出的錢多的數目。

對於每一個人,他名字的列印順序應和他在輸入的2到NP+1行中輸入的順序相同。所有的送禮的錢都是整數。

每個人把相同數目的錢給每位要送禮的朋友,而且儘可能多給,不能給出的錢被送禮者自己保留。

樣例輸入

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

正片開始!
這是一道十分淼的題,題意即為:NP個人互相“送錢”,然後叫你求每個人收到的比送出的錢多的數目。

那麼:我們直接開一個結構體,再用map編個序不就OK了?

理論存在,開始Code

#include <bits/stdc++.h>
using namespace std;
int n;
map <string, int> na;//構建map陣列用於快速呼叫p[i].name
struct Node {
	string name;
	int m1;
	int m2;
} p[20];//結構體,name:名字,m1:收入,m2:付出
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		cin >> p[i].name;//輸入
		na[p[i].name] = i;//將p[i].name編下標
	}
	string c;
	int a, b;
	for (int i = 1; i <= n; i++) {
		cin >> c;//輸入
		int k = na[c];//獲取c這個人的下標
		scanf("%d%d", &a, &b);//輸入
		if (b == 0) 
			continue;//如果要分給0個人,直接進入下一個迴圈,因為x/0這個式子不成立
		p[k].m1 = a;
		for (int j = 1; j <= b; j++) {
			cin >> c;
			p[na[c]].m2 += p[k].m1 / b;//“送錢”
			p[k].m1 = p[k].m1 / b * b;//注意的問題:送出去的錢是整數!
		}
	}
	for (int i = 1; i <= n; i++) {
		cout << p[i].name << ' ';
		printf("%d\n", p[i].m2 - p[i].m1);//輸出
	}
	return 0;//完結撒花!
}
沒登陸的看這裡:

#include <bits/stdc++.h>
using namespace std;
int n;
map <string, int> na;
struct Node {
    string name;
    int m1;
    int m2;
} p[20];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        cin >> p[i].name;
        na[p[i].name] = i;
    }
    string c;
    int a, b;
    for (int i = 1; i <= n; i++) {
        cin >> c;
        int k = na[c];
        scanf("%d%d", &a, &b);
        if (b == 0) 
            continue;
        p[k].m1 = a;
        for (int j = 1; j <= b; j++) {
            cin >> c;
            p[na[c]].m2 += p[k].m1 / b;
            p[k].m1 = p[k].m1 / b * b;
        }
    }
    for (int i = 1; i <= n; i++) {
        cout << p[i].name << ' ';
        printf("%d\n", p[i].m2 - p[i].m1);
    }
    return 0;
}

最後附上題目鏈:P1201 [USACO1.1] 貪婪的送禮者Greedy Gift Givers - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

相關文章