Codeforces #263 Div2 B

題目大意“給定一段大寫字母序列。

從n張牌中挑k張,每一張會+選出的牌中與它字母相同牌的數量一樣的分數,問最大總分

題目分析:

肯定是貪心地選取當前cnt[i]最大的卡片。所以要用一個cnt數組記錄每個數字出現的次數,又因爲是大寫字母,所以可以映射成1-26.

如下代碼:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
using namespace std;
char str[N];
int n,k,a[N];
bool v[N];
int cnt[N];
int main()
{
	scanf("%d%d",&n,&k);
	scanf("%s",str);
	memset(cnt,0,sizeof(cnt));
	for(int i=0;i<n;i++)
	{
		a[i]=str[i]-'A'+1;
		cnt[a[i]]++;
	}
	sort(cnt+1,cnt+27);
	long long  ans=0;
	for(int i=26;i>=1;i--)
	{
		if(cnt[i]==0)
			continue;
		if(cnt[i]>=k)
		{
			ans+=(long long)k*k;
			break;
		}
		else if(cnt[i]<k)
		{
			ans+=(long long)cnt[i]*cnt[i];	
			k-=cnt[i];
		}
	}
	cout<<ans<<endl;
	//while(1);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章