1. 程式人生 > >【推導】【貪心】Codeforces Round #431 (Div. 1) A. From Y to Y

【推導】【貪心】Codeforces Round #431 (Div. 1) A. From Y to Y

aaa return 最大的 tchar 題意 spa 必須 puts clu

題意:讓你構造一個只包含小寫字母的可重集,每次可以取兩個元素,將它們合並,合並的代價是這兩個元素各自的從‘a’到‘z’出現的次數之積的和。

給你K,你構造的可重集必須滿足將所有元素合而為一以後,所消耗的最小代價恰好為K。

考慮只包含一種類字母的消耗代價,以a為例:

a 0

aa 1

aaa 3

aaa 6

aaaa 10

aaaaa 15

... ...

而且如果再其上任意疊加別的字母的話,是互不幹涉的。於是可以貪心地從K中依次減去最大的一個上表中的數,輸出那麽多‘a’,然後下一次換成‘b‘,如此循環……

容易發現,每一輪會讓K變成sqrt(K),所以收斂地非常快。

#include<cstdio>
#include<algorithm>
using namespace std;
int n,base[100005],e;
int main(){
	int t=0;
	for(int i=1;;++i){
		t+=i;
		if(t>100000){
			break;
		}
		base[++e]=t;
	}
	scanf("%d",&n);
	if(n==0){
		puts("a");
		return 0;
	}
	char c=‘a‘;
	while(n){
		int* p=upper_bound(base+1,base+e+1,n);
		--p;
		for(int i=1;i<=p-base+1;++i){
			putchar(c);
		}
		++c;
		n-=(*p);
	}
	puts("");
	return 0;
}

【推導】【貪心】Codeforces Round #431 (Div. 1) A. From Y to Y