1.1.2 Greedy Gift Givers

     很简单一道题, 但是没弄清题意把我害惨了……

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    ofstream fout ("gift1.out");
    ifstream fin ("gift1.in");
    string name[11], temp;
    long long n, i, j, k,  money[11]={0};
    fin >> n;
   // cin>>n;
    for(i=0; i<n; i++)
    {
        fin>>name[i];
       // cin>>name[i];
    }
    
    long long sum, num;
    
    for(i=0; i<n; i++)
    {
    	fin>>temp;
    //	cin>>temp;
    	
    	fin>>sum>>num;
    //	cin>>sum>>num;
    	
    	if(  num==0 ) continue;//原来我写的break;结果不对; 后来我才发现, num=0时不是输入结束的标志
    	
    	for(k=0; k<n; k++)
    	{
	    	if( temp==name[k] )
    		{
		    	money[k]-=sum/num*num;
	    	}
	   	}
    	
    	for(j=0; j<num; j++)
    	{
	    	fin>>temp;
	    //	cin>>temp;
	    	
	    	for(k=0; k<n; k++)
	    	{
	    		if( temp==name[k] )
	    		{
		    		money[k]+=sum/num;
		    	}
	    	}	
	    }
    	
    }
    
    for(i=0; i<n; i++)
    {
       fout<<name[i]<<" "<<money[i]<<endl;
      // cout<<name[i]<<" "<<money[i]<<endl;
    }
    
    return 0;
}

用STL写的:

#include<iostream>
#include<fstream>
#include<map>
#include<cstdio>
using namespace std;
int main()
{
    ifstream fin("gift1.in");
    ofstream fout("gift1.out");
    
	map<string, int> m;
	char str[50][15], name[15];
	int n, i;
	
	//scanf("%d", &n);
	fin>>n;
	for(i=0; i<n; i++)
	    //scanf("%s", str[i]);
        fin>>str[i];
    
    int sum, num, temp;
    
    for(i=0; i<n; i++)
    {
    	//scanf("%s %d %d", name, &sum, &num);
    	fin>>name>>sum>>num;
    	if( num!=0 )
    	{
    		temp=sum/num;
	    	m[name]-=temp*num;
	    	while( num-- )
	    	{
	    	    //scanf("%s", name);
	    	    fin>>name;
	    		m[name]+=temp;
	    	}
	    }
    }
    
    for(i=0; i<n; i++)
        //printf("%s %d\n",str[i], m[str[i]]);	
        fout<<str[i]<<" "<<m[str[i]]<<endl;
} 



你可能感兴趣的:(1.1.2 Greedy Gift Givers)