题解:P13463 [GCJ 2008 #1C] Text Messaging Outrage

· · 题解

题解

看到这道题第一眼就是贪心。

我们发现,出现字母的次数越多,我们就越应该把它放在前面,所以直接对数组排序,越大的放在前面,也就是将次数 \times 1,以此类推,统计答案即可。

正确代码

#include <bits/stdc++.h>
#define int long long//十年OI一场空,不开 long long 见祖宗。
using namespace std;
int a[1000005];
signed main()
{
    int t;
    scanf("%lld",&t);
    for(int i=1;i<=t;i++)
    {
        int n,m,k;
        scanf("%lld%lld%lld",&n,&m,&k);
        for(int j=1;j<=k;i++) scanf("%lld",&a[j]);
        sort(a+1,a+k+1);
        int cnt = 1,qwq = 0,ans = 0;
        for(int j=k;j>=1;i--)
        {
            ans+=a[j]*cnt;
            qwq++;
            if(qwq==m)//统计现在应该分配到第几个键了
            {
                cnt++;
                qwq = 0;
            }
        }
        printf("Case #%lld: %lld\n",i,ans);//输出
    }
}//请不要直接复制粘贴,谢谢