BestCoder Round 69 Div 2 1001&& 1002 || HDU 5610 && 5611

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5610

如果杠铃总质量是奇数直接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 }
View Code

 

  等个明后天把1002题补了。立个FLAG

http://acm.hdu.edu.cn/showproblem.php?pid=5611

代码效率不高,速度很慢。主要是在年月日的判断上先判断谁还可以优化一下。但是还算浅显易懂。

  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 }
View Code

剩下的两道真的有空再补,立FLAG

posted @ 2016-01-24 18:15  syuritsu  阅读(185)  评论(0编辑  收藏  举报