【推導】【貪心】Codeforces Round #431 (Div. 1) A. From Y to Y
阿新 • • 發佈:2017-09-03
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