这个题看上去是一个贪心, 但是这个贪心显然是错的. 事实上这道题目很简单, 先判断1个是否可以, 然后判断2个是否可以. 之后找到最小的 k(k>2) , 使得 (m−k)mod6=0 即可. 证明如下: 3n(n−1)+1=6(n∗(n−1)/2)+1 , 注意到 n∗(n−1)/2 是三角形数, 任意一个自然数最多只需要3个三角形数即可表示. 枚举需要 k 个, 那么显然 m=6(k个三角形数的和)+k , 由于 k≥3 , 只要 m−k 是6的倍数就一定是有解的.事实上, 打个表应该也能发现规律.
这题真心挺难的,因为我并不知道这个结论,做个题解记录一下吧,以后记得就好
int san[MAX]; int xcount; void dabiao(){ xcount=0; for(int i=0;i*(i+1)<=1e9;i++){ san[i]=i*(i+1)/2; xcount++; } } int main(){ int t; scanf("%d",&t); dabiao(); while(t--){ int m; scanf("%d",&m); //printf(" "); int k=m-1; if(k%6==0){ int pos=lower_bound(san,san+xcount,k/6)-san; if(san[pos]==k/6){ printf("1\n"); continue; } } k--; int flag=0; if(k%6==0){ for(int i=0;i<xcount;i++){ int pos=lower_bound(san,san+xcount,k/6-san[i])-san; //printf("%d\n",pos); if(san[pos]==k/6-san[i]){ printf("2\n"); flag=1; break; } } } if(!flag){ for(int i=3;i<=m;i++){ if((m-i)%6==0){ printf("%d\n",i); break; } } } } return 0; }
BestCoder 1st Anniversary ($) 第三题 Sequence
最新推荐文章于 2020-02-12 10:55:07 发布