题目

源地址:

http://codeforces.com/contest/12/problem/C

理解

题意并不复杂:给定一些标价牌,然后再给定一些水果的名字,每种水果对应一个标价牌。要求输出水果总价的最大值和最小值。 第一眼感觉很简单,贪心乱搞。标价牌排序之后,如果求最小值就从前往后选;如果求最大值,就从后往前选。这个思路没有太大的问题,然后问题来了,我怎么样才能够得到一个去除重复项,并且能计算出每种水果数量的数据结构呢? 然后我就开始SB了,因为循环的时候字符串写得搓,debug半天,都不符合我的预期。等到队友们基本都过了,我才勉强A题。

代码


#define MAXN 100+10

int n,m;
int price[MAXN];
string x[MAXN];
string y[MAXN];
int flag[MAXN];
int tmp;
int ansMin,ansMax;

struct node
{
    string s;
    int flag;
}str[MAXN];

bool cmp(node a, node b)
{
    return a.flag>b.flag;
}

void init()
{
    tmp=0;
    memset(flag,0,sizeof(flag));
    scanf("%d%d", &n,&m);
    for(int i=0; i<n; i++)
    {
        scanf("%d", &price[i]);
    }
    sort(price, price+n);
    for(int i=0; i<m; i++)
    {
        cin>>x[i];
    }
    sort(x,x+m);
    y[tmp]=x[0];
    flag[0]=1;
    for(int i=1;i<m;i++)
    {
        if(x[i].compare(y[tmp])==0)
        {
            flag[tmp]++;
        }
        else
        {
            tmp++;
            y[tmp]=x[i];
            flag[tmp]=1;
        }
    }
    tmp++;
    for(int i=0;i<tmp;i++)
    {
        str[i].s=y[i];
        str[i].flag=flag[i];
    }
    sort(str,str+tmp,cmp);
}

int main(int argc, char const *argv[])
{
    init();
    for(int i=0;i<tmp;i++)
    {
        ansMin+=str[i].flag*price[i];
        ansMax+=str[i].flag*price[n-i-1];
    }
    printf("%d %d\n", ansMin, ansMax);
    return 0;
}

更新日志

  • 2014年11月21日 已AC。