题意: 给你一个数,求不大于这个数的最大的 满足 i*i*i+j*(j+1)*(j+2)/6 的值
题解: 数据很小。打表二分。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;
const int maxn=10000;
int a[maxn*2];
int n;
int main(){
int cnt=0;
for(int i=1;i<=53;++i){
a[cnt++]=i*i*i;
}
for(int i=1;i<=95;++i){
a[cnt++]=i*(i+1)*(i+2)/6;
}
for(int i=0;i<53;++i){
for(int j=53;j<53+95;++j){
a[cnt++]=a[i]+a[j];
}
}
sort(a,a+cnt);
while(~scanf("%d",&n)&&n){
int pos=lower_bound(a,a+cnt,n)-a;
if(a[pos]==n) printf("%d\n",a[pos]);
else printf("%d\n",a[pos-1]);
}
return 0;
}