要求:
输入样例:
3
3 1 2
3 1 1
3 1 3
输出样例:
Case #1: POSSIBLE
1
2
Case #2: POSSIBLE
2
1 2
Case #3: IMPOSSIBLE
样例解释:
代码:
#include<iostream>
using namespace std;
int T;
int N,X,Y;
int main() {
cin>>T;
for(int j=1; j<=T; j++) {
int sum=0;
cin>>N>>X>>Y;
for(int i=1; i<=N; i++)
sum+=i;//数据总和
//条件筛选
if(sum%(X+Y)!=0)//不存在合理方案
cout<<"Case #"<<j<<":"<<"IMPOSSIBLE"<<endl;
else {
int A[N]={0};//装艾伦的数,每一次清零
int cnt=0;//艾伦选取的数字数量
int b=sum/(X+Y);//每份占额
//艾伦占比为X,即选取数和为X*b
//从后往前找加和为X*b的数,记录为艾伦选的数
//为什么从后往前找:因为如果从头选,你就有可能选不到
//比如样例n=8,x=3,y=6;
//1-8总和是36, 每一份比例是b = 8/(3+6) = 4
//x比例是3,每一份b是4,所以艾伦选的数的总和是3*4=12,
//然后从1-n中选取能够加起来是12的数,12345678,这样看来加完前面1+2+3+4=10 不够12
//这样就不能够成功取到
//如果从后面往前87654321,可以取到8+4就可以直接取到了
//此处受教于栗子ing~
int Alan=X*b;
for(int s=N; s>=1; s--) {
if(s<=Alan) {
A[cnt++]=s;
Alan-=s;
}}
cout<<"Case #"<<j<<":"<<"POSSIBLE"<<endl;
cout<<cnt<<endl;
for(int i=0; i<cnt; i++)
cout<<A[i]<<' ';
cout<<endl;
}
}
return 0;
}