这道题当初还觉得是什么高深莫测的算法,dp仍是搜索剪枝,没想到竟然是道普普统统的贪心+模拟。这都没看出来,服了。c++
这道题错在两个地方:算法
之后必定记住,求n(n+1)<x的最大整数n,向下取整后,还要有一步循环相减,无论这一步是否有效spa
#include <bits/stdc++.h> using namespace std; vector<int> va,vb; int main() { int a,b; cin>>a>>b; int n=sqrt(2.0*(a+b)); while (n*(n+1)/2>(a+b)) n--; //cout<<"n=\t"<<n<<endl; for (int i=n;i>=1;i--) { if (a>=i) {a-=i;va.push_back(i);} else vb.push_back(i); } cout<<va.size()<<endl; if (!va.empty()) cout<<va[0]; for (int i=1;i<(int)va.size();i++) cout<<' '<<va[i]; cout<<endl; cout<<vb.size()<<endl; if (!vb.empty()) cout<<vb[0]; for (int i=1;i<(int)vb.size();i++) cout<<' '<<vb[i]; cout<<endl; return 0; }