如果杠铃总质量是奇数直接impossible
接着就考验耐心和仔细周全的考虑了。在WA了三次后终于发现问题了,想对自己说是不是撒
首先最好从大的那个开始考虑,我的方案就是两数交换一下,结果输出的时候没有考虑。。。
然后就是要求a+b最小,那么循环就要从大的开始向小的循环。
其实我也解释不清楚,更解释不清楚的是学长取名的Baby Nero,一直以为铭铭姐是女的的我,在看到真的铭神的照片的时候惊呆了
比赛时候的渣代码:
#include <cstdio> #include <iostream> #include <cmath> #include <cstring> #include <queue> #include <vector> using namespace std; int a,b,c; int sum[100005][3] = {}; int main(){ int T; scanf("%d",&T); while(T--){ int cnt = 0; int big_flag = 0; memset(sum,0,sizeof(sum)); scanf("%d%d%d",&a,&b,&c); if(c & 1){ printf("Impossible\n"); } else{ //let b is bigger than a if(a > b){ int t = a;a = b;b = t; big_flag = 1; } for(int i = (c/2)/b;i >= 0; i --){ if(((c/2) - b *i)%a==0){ sum[cnt][0] = 2*((c/2)-b*i)/a; sum[cnt][1] = 2*i; cnt++; } } if(sum[0][0] == 0 && sum[0][1]==0){ printf("Impossible\n"); } else{ int flag = 0; int minn = sum[0][0] + sum[0][1]; for(int i = 0;i < cnt ;i++){ if(minn >= sum[i][0]+ sum[i][1]){ minn = sum[i][0]+ sum[i][1]; flag = i; } } if(!big_flag){ printf("%d %d\n",sum[flag][0],sum[flag][1]); } else{ printf("%d %d\n",sum[flag][1],sum[flag][0]); } } } } return 0; }
等个明后天把1002题补了。立个FLAG
BestCoder Round 69 Div 2 1001 && HDU 5610
原文:http://www.cnblogs.com/syuritsu/p/5155579.html