水题水一波、

昨晚被dp搞的不轻、最气的是看题解都看不懂、

本想今天拿水题来练练手感、
结果我发现我错了、!!!
总结一下自己的错误把、   真希望错过的东西都不要在错了、
 
 
HDU 1070 Milk
题意:就是一个人去超市买牛奶、给你一些牛奶的牌子 价钱 容量,牛奶的保质期是6天、并且每天喝200ml,如果某种牛奶的容量小于200ml 这种牛奶直接就被拉黑了,并且保证所有的牛奶都是当日产的,要你求买那种牛奶最便宜,而且他只会买一瓶牛奶、上面给出的各种品牌的牛奶都是一瓶的价格容量,如果有多种牛奶同样便宜,要求输出容量大的、
思路:不难,但是题意说的很罗嗦,就是求每升牛奶的价格最低的那一个、 但是这里有个细节,就是那些容量超过1200ml的牛奶的处理,因为他只会喝1200ml 所以就算你容量再多也是多余的、  超过的部分直接舍去
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 const int qq=150;
 5 struct Milk
 6 {
 7     char s[150];
 8     int p;
 9     int v;
10 }milk[qq];
11 int partition(int l,int r)
12 {
13     int i,j;
14     Milk x=milk[l];
15     i=l;j=r;
16     while(1){
17         while(i<j && milk[j].v>=x.v)    --j;
18         milk[i]=milk[j];
19         while(i<j && milk[i].v<=x.v)    ++i;
20         milk[j]=milk[i];    
21             if(i>=j)    break;    
22     }
23     milk[i]=x;
24     return i;
25 }
26 void quick(int l,int r)
27 {
28     if(l<r){
29         int temp=partition(l,r);
30         quick(l,temp-1);
31         quick(temp+1,r);
32     }
33 }
34 int main()
35 {
36     int t;scanf("%d",&t);
37     while(t--){
38         int n;scanf("%d",&n);
39         char str[150];
40         int x,y;int count=0;
41         for(int i=0;i<n;++i){
42             scanf("%s%d%d",str,&x,&y);
43             if(y<200)    continue;
44             strcpy(milk[count].s,str);
45             milk[count].p=x;
46             milk[count++].v=y;
47         }
48         quick(0,count-1);    //排序一下 从容量大往容量小去比较、
49         Milk cheap=milk[count-1];
50         if(cheap.v>=1200)
51             cheap.v=1200;
52         for(int i=count-2;i>=0;--i){
53             if(milk[i].v>=1200)
54                 milk[i].v=1200;
55             if(cheap.p*1.0/cheap.v*1200>milk[i].p*1.0/milk[i].v*1200)
56                 cheap=milk[i];
57         }
58         printf("%s\n",cheap.s);
59     }
60     return 0;
61 } 

 

HDU 1062 Text Reverse
题意:就是将所有单词反转过来按英语作文的方式输出
这题有点坑阿、  我自己写了几种做法都WA了、  但是我就是不知道错在哪里、
先贴一个对的、  这种做法就直接对每一个单词进行输出
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<stack>
 4 using namespace std;
 5 char s[2000];
 6 int blank[1020];
 7 int main()
 8 {
 9     int t;scanf("%d",&t);
10     getchar();
11     while(t--){
12         memset(blank,0,sizeof(blank));
13         gets(s);
14         int count=1;
15         blank[0]=-1;
16         int len=strlen(s);
17         s[len]=' ';
18         s[len+1]='\0';
19           for(int i=0;i<=strlen(s);++i)
20               if(s[i]==' ')
21                   blank[count++]=i;
22           for(int i=1;i<count;++i){
23               for(int j=blank[i]-1;j>=blank[i-1]+1&&s[j]!=' ';--j)  // 不加s[j]!=' ' 会WA,我也不知道为什么
24                   printf("%c",s[j]);                    // 我自己想是觉得不用加的、
25               if(i!=count-1)    printf(" ");
26         }
27         printf("\n");
28     }
29     return 0;
30 }

HDU 1019 Least Common Multiple

这题是真的水、 一发A了、 只需要注意数据不溢出就行了、  那么就先进行除法嘛

题意:求多个数的最大公倍数、

思路:你想想如果你能求出其中两个数的最大公倍数、那么n个数的最大公倍数是肯定大于等于这两个数的最大公倍数的、

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 const int qq=50000;
 7 int gcd(int a,int b)
 8 {
 9     return b==0?a:gcd(b,a%b);
10 }
11 int num[qq];
12 int main()
13 {
14     int t;scanf("%d",&t);
15     while(t--){
16         int n;scanf("%d",&n);
17         for(int i=0;i<n;++i)
18             scanf("%d",&num[i]);
19         if(n==1){
20             printf("%d\n",num[0]);
21             continue;
22         }
23         if(num[0]<num[1]){
24             num[0]=num[0]+num[1];
25             num[1]=num[0]-num[1];
26             num[0]=num[0]-num[1];
27         }
28         int maxn=num[0]/gcd(num[0],num[1])*num[1];
29         for(int i=2;i<n;++i){
30             if(num[i]>maxn)    maxn=max(maxn,maxn/gcd(num[i],maxn)*num[i]);
31             else            maxn=max(maxn,maxn/gcd(maxn,num[i])*num[i]);
32         }
33         printf("%d\n",maxn);
34     }
35 }

 

posted @ 2016-04-06 20:41  我不萌、我要高冷  阅读(139)  评论(0编辑  收藏  举报