USACO 1.1.2 Greedy Gift Givers

3268 ワード

マイ:
問題の難点は、テーマの理解と名前の記憶です.
get[]は受け取ったお金を預け、money[]は最初は贈り物者の元のお金の数で、それから送られた総お金の数を格納します
この問題はファイルでCode blocksでは通じませんが、提出時にはOKで、どういうことかわかりません
/*
ID:90girl1
PROG: gift1
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<string>
#define NP 15
using namespace std;
int main()
{


    ifstream fin("gift1.in");
    ofstream fout("gift1.out");
    int np,get[NP],money[NP],n,i,j,k,l;//get[]     ,money[]   ,       
    string name[NP],giver,geter;

    fin>>np;//    
    for(i=0; i<np; i++)
    {
        fin>>name[i];
        get[i]=0;
        money[i]=0;
    }

    for(j=0; j<np; j++)
    {
        fin>>giver;
        for(k=0; k<np; k++)
            if(name[k]==giver)
                break;
      //              
        fin>>money[k]>>n;   //   k    if     k;
        for(l=0; l<n; l++)
        {
           fin>>geter;
            for(i=0; i<np; i++)
                if(name[i]==geter)
                    break;

            get[i]+=money[k]/n;  //sb   +~~~~(>_<)~~~~

        }
        if(n)
            money[k]=(money[k]/n)*n;
    }
     for(i=0;i<np;i++)
      fout<<name[i]<<" "<<get[i]-money[i]<<endl;

    return 0;

}

UASCOの問題解:
The hardest part about this problem is dealing with the strings representing people's names.

We keep an array of Person structures that contain their name and how much money they give/get.

The heart of the program is the lookup() function that, given a person's name, returns their Person structure. We add new people with addperson().

Note that we assume names are reasonably short.

#include <stdio.h>
#include <string.h>
#include <assert.h>

#define MAXPEOPLE 10
#define NAMELEN	32

typedef struct Person Person;
struct Person {
    char name[NAMELEN];
    int total;
};

Person people[MAXPEOPLE];
int npeople;

void
addperson(char *name)
{
    assert(npeople < MAXPEOPLE);
	strcpy(people[npeople].name, name);
    npeople++;
}

Person*
lookup(char *name)
{
    int i;

    /* look for name in people table */
    for(i=0; i<npeople; i++)
	if(strcmp(name, people[i].name) == 0)
	    return &people[i];

    assert(0);	/* should have found name */
}

int
main(void)
{
    char name[NAMELEN];
    FILE *fin, *fout;
    int i, j, np, amt, ng;
    Person *giver, *receiver;

    fin = fopen("gift1.in", "r");
    fout = fopen("gift1.out", "w");

    fscanf(fin, "%d", &np);
    assert(np <= MAXPEOPLE);

    for(i=0; i<np; i++) {
	fscanf(fin, "%s", name);
	addperson(name);
    }

    /* process gift lines */
    for(i=0; i<np; i++) {
	fscanf(fin, "%s %d %d", name, &amt, &ng);
	giver = lookup(name);

	for(j=0; j<ng; j++) {
	    fscanf(fin, "%s", name);
	    receiver = lookup(name);
	    giver->total -= amt/ng;
	    receiver->total += amt/ng;
	}
    }

    /* print gift totals */
    for(i=0; i<np; i++)
	fprintf(fout, "%s %d
", people[i].name, people[i].total); exit (0); }