题目链接:点击打开链接
题意:a个球装在一个盒子里,再拿一个新的盒子,在所有旧盒子中取一个球放入新的盒子中,然后将这些盒子里的球数量从小到大排序,若连着两次盒子个数以及每个盒子中的球的个数相同,那么这个数就是我们要的。(举个栗子:a=2-->1,1-->2(出现了相同的数但不是连着的,那么2不是我们要的数), 再如a=3-->1,2-->1,2 , 那么3就是我们要的数,再如a=6-->1,5-->2,4-->1,2,3-->1,2,3 ,那么6也是我们要的数)现在给你一个数n,问在1到n中符合条件的最大数是多少?
思路:这道题是一道规律题,我们例举前几个符合条件的数(1,3,6,10)就会发现1=1,3=1+2,6=1+2+3,10=1+2+3+4.这下发现规律了吧:符合条件的数是等差数列的和,,那么我们来想一下怎么样才能求出最大的符合条件的数呢?既然知道了要求的数是a1=1,d=1的等差数列的前n项和,那我们就只要找到下标n,再把前n项和求出来不就是我们要的答案了吗。那怎么确定下标n呢,前n项和公式:n*(n+1)/2,那么只要满足n*(n+1)/2<=N(题目给的值)就可以把下标求出来了,具体看代码咯:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
using namespace std;
typedef long long LL;
LL n,tmp;
int main()
{
int t,tt=1;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
tmp=n;
n=sqrt(n*2)+10;//把下标n调大一点,不然会错
LL i;//防爆int,for循环里有乘法
for(i=n;i>=1;i--)
if(i*(i+1)/2<=tmp) break;
printf("Case #%d: %lld\n",tt++,i*(i+1)/2);
}
}