昨晚被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 }
时间: 2024-11-05 06:29:05