题目链接:http://codeforces.com/contest/1305/problem/E
题意:给你一个n和m,要你构造一个长度为n的序列,且序列满足a[i]<a[i+1],而且必须要有m组a[i]+a[j]=a[k](i<j<k),如果不存在就输出-1.
思路:如果m=0,那就输出n个奇数,否则序列可以从1开始构造,那对于i,他的贡献度为(i-1)/2。如果n个数的总贡献度小于m,那就输出-1,否则就找到第一个x,使前x个数的总贡献度大于等于m。然后输出1到x-1,现在还多了sum[x]-m的贡献度,当每次x+=2时,贡献度就会减1,所以当x加到x+2*(sum[x]-m)就刚好凑齐贡献度,然后剩下的数都比前一个数大x+2*(sum[x]-m)+1就可以了。
#include<cstdio> #include<cstring> #include<cmath> #include<string> #include<iostream> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; int a[5005]; int main() { int n,m; scanf("%d%d",&n,&m); if(m==0) { for(int i=1;i<=n;i++) printf("%d ",i*2-1); printf(" "); return 0; } int p=-1; for(int i=1;i<=n;i++) { a[i]=a[i-1]+(i-1)/2; if(a[i]>=m) { p=i; break; } } if(p==-1) { printf("-1 "); return 0; } int x=p+2*(a[p]-m); for(int i=1;i<p;i++) printf("%d ",i); printf("%d ",x); int y=x+1; for(int i=p+1;i<=n;i++) { x+=y; printf("%d ",x); } printf(" "); }