BestCoder Round 69 Div 2 1001&& 1002 || HDU 5610 && 5611
如果杠铃总质量是奇数直接impossible
接着就考验耐心和仔细周全的考虑了。在WA了三次后终于发现问题了,想对自己说是不是撒
首先最好从大的那个开始考虑,我的方案就是两数交换一下,结果输出的时候没有考虑。。。
然后就是要求a+b最小,那么循环就要从大的开始向小的循环。
其实我也解释不清楚,更解释不清楚的是学长取名的Baby Nero,一直以为铭铭姐是女的的我,在看到真的铭神的照片的时候惊呆了
比赛时候的渣代码:
1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstring> 5 #include <queue> 6 #include <vector> 7 8 using namespace std; 9 10 int a,b,c; 11 int sum[100005][3] = {}; 12 13 int main(){ 14 int T; 15 scanf("%d",&T); 16 while(T--){ 17 int cnt = 0; 18 int big_flag = 0; 19 memset(sum,0,sizeof(sum)); 20 scanf("%d%d%d",&a,&b,&c); 21 if(c & 1){ 22 printf("Impossible\n"); 23 } 24 else{ 25 //let b is bigger than a 26 if(a > b){ 27 int t = a;a = b;b = t; 28 big_flag = 1; 29 } 30 for(int i = (c/2)/b;i >= 0; i --){ 31 if(((c/2) - b *i)%a==0){ 32 sum[cnt][0] = 2*((c/2)-b*i)/a; 33 sum[cnt][1] = 2*i; 34 cnt++; 35 } 36 } 37 if(sum[0][0] == 0 && sum[0][1]==0){ 38 printf("Impossible\n"); 39 } 40 else{ 41 int flag = 0; 42 int minn = sum[0][0] + sum[0][1]; 43 for(int i = 0;i < cnt ;i++){ 44 if(minn >= sum[i][0]+ sum[i][1]){ 45 minn = sum[i][0]+ sum[i][1]; 46 flag = i; 47 } 48 } 49 if(!big_flag){ 50 printf("%d %d\n",sum[flag][0],sum[flag][1]); 51 } 52 else{ 53 printf("%d %d\n",sum[flag][1],sum[flag][0]); 54 } 55 } 56 } 57 } 58 59 return 0; 60 }
等个明后天把1002题补了。立个FLAG
代码效率不高,速度很慢。主要是在年月日的判断上先判断谁还可以优化一下。但是还算浅显易懂。
1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstring> 5 #include <queue> 6 #include <vector> 7 8 #define rep(i,a,n) for(int i = a;i < n;i++) 9 #define per(i,a,n) for(int i = n-1;i >=a;i--) 10 #define pb push_back 11 #define VI vector<int> 12 #define QI queue<int> 13 14 typedef long long ll; 15 16 using namespace std; 17 18 int a,b,n; 19 char ch[12] = {}; 20 int num[12] = {}; 21 22 int check(){ 23 int flag = 0; 24 rep(i,6,10) if(num[i]!=num[i+1]) flag = 1; 25 if(flag == 0) return 1; 26 27 flag = 0; 28 rep(i,6,10) if(num[i]!=num[i+1]-1) flag = 1; 29 if(flag == 0) return 1; 30 31 flag = 0; 32 rep(i,6,10) if(num[i]!=num[i+1]+1) flag = 1; 33 if(flag == 0) return 1; 34 35 /*NOTE: 36 PHONE NUMBER SAMPLE 138-1997-05-06 37 012 3456 78 9[10] 38 */ 39 int y = num[3] * 1000 + num[4] * 100 + num[5] * 10 + num[6]; 40 int m = num[7] * 10 + num[8]; 41 int d = num[9] * 10 + num[10]; 42 if(y < 1980 || y > 2016 ){ 43 return 0; 44 } 45 else{ 46 if(m < 1 || m > 12 ){ 47 return 0; 48 } 49 else{ 50 if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12){ 51 if(d < 1 || d > 31 ){ 52 return 0; 53 } 54 else{ 55 return 1; 56 } 57 } 58 else{ 59 if(m == 2 ){ 60 if((y%100==0&&y%400==0)||(y%100!=0&&y%4==0)){ 61 if(d < 1 || d > 29){ 62 return 0; 63 } 64 else{ 65 return 1; 66 } 67 } 68 else{ 69 if(d < 1 || d > 28 ){ 70 return 0; 71 } 72 else{ 73 return 1; 74 } 75 } 76 } 77 else{ 78 if(d < 1 || d > 30){ 79 return 0; 80 } 81 else{ 82 return 1; 83 } 84 } 85 } 86 } 87 } 88 } 89 90 int main(){ 91 int T; 92 scanf("%d",&T); 93 while(T--){ 94 ll sum = 0; 95 scanf("%d%d%d",&n,&a,&b); 96 rep(i,1,n+1){ 97 scanf("%s",ch); 98 rep(j,0,11){ 99 num[j] = ch[j] - '0'; 100 } 101 if(check()){ 102 sum += a; 103 } 104 else{ 105 sum += b; 106 } 107 } 108 cout<<sum<<endl; 109 } 110 return 0; 111 }
剩下的两道真的有空再补,立FLAG