【USACO】 貪婪的禮物送禮者

問題 A: 貪婪的禮物送禮者
時間限制: 1 Sec 內存限制: 128 MB
題目描述

對於一羣要互送禮物的朋友,你要確定每個人送出的禮物比收到的多多少(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

題意描述:
一些人給一些人送禮,當然送禮的人也會收到一些禮物,問每個人收到的禮物比送出的禮物多多少?
解題思路:
簡單的數據結構問題,將收到的禮物和送出去的禮物分別存到兩個數組裏面最後減一下就行,在寫的時候無非是討論收入和送出禮物兩種情況,也就是討論送出禮物的價值,和收到禮物的人的情況
AC代碼:

#include<stdio.h>
#include<string.h>
struct Lnode
{
    char name[50];
    int money;
    int money1;
}s[20];
int main()
{
    char str[50],str1[50];
    int i,j,k,num,m,T,u,v;
    while(scanf("%d", &T)!=EOF)
    {
          for(i=1; i<=T; i++)
          {
            scanf("%s", s[i].name);
            s[i].money=0;
            s[i].money1=0;
          }
        for(i=1; i<=T; i++)
        {
         scanf("%s", str);
         scanf("%d %d", &k,&num);
         for(j=1; j<=T; j++)//找人 
         {
            if(strcmp(s[j].name,str)==0)
            {
                u=j;
                break;
            }
         }
            if(num==0)//如果沒人收禮物那就不用討論收到
            //禮物的多少和送出多少禮物
             continue;
            else if(k==0)//不送出禮物但是有人收這就要求將
            //收禮物的人的名字輸入不需進行任何其他操作
            {
                for(v=1; v<=num; v++)
                 scanf("%s", str1);
            }
            else if(k!=0&&num!=0) 
            {
                s[u].money=k-k%num;
                for(j=1; j<=num; j++)
                {
                    scanf("%s", str1);
                    for(v=1; v<=T; v++)
                    {
                        if(strcmp(str1,s[v].name)==0)
                        s[v].money1+=k/num;
                    }
                }
            }   
    }
    for(int t=1; t<=T; t++)
        printf("%s %d\n", s[t].name,s[t].money1-s[t].money);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章