k个数必须是各不相同的。这题属于思维错误题。关键是想到用(k-1)*k/2把必要的base值先求出来。
http://acm.hdu.edu.cn/showproblem.php?pid=4982
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<map>
#include<cmath>
#include<stack>
#include<stdlib.h>
#include<cstdio>
#define ll long long
using namespace std;
int main(){
int n,k;
while(cin>>n>>k){
int p=(k-1)*k/2,u=0;
for(int i=sqrt(p)+(sqrt(p)-(int)sqrt(p)>0);i*i<n;++i){ //枚举符合的平方数(sqrt取上整)
int a=n-i*i;
if(k-a==0&&i*i-p==1) //如果剩下的数刚好=k且多余力气=1(说明只能最后一个数向右移动1凑出i*I)
continue;
if(k-a<=i*i-p){ //要把这一格移到末尾使之空出来的力气和所能提供的多余力气
u=1;
break;
}
}
if(u==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
/*
7 3
*/