网址:CSUST练习2
这次的小练是我们这组出的题,我出了3道:A,C,DTeilwal出了一道:B,从此不再 出了一道:E,然后这次题目在群里遭到几乎全体的吐槽.....Orz......都是英文题,而且都很长.....这绝对是巧合!恩,巧合~╮(╯▽╰)╭
猴子要摘香蕉,有N种箱子,分别给出长宽高,每种箱子有无限个,要求下面那个箱子的长宽要比上面那个大,求最高的高度。
代码: 0MS 其实就是一个排序&LIS
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 int ma(int x,int y) 7 { 8 return x>y?x:y; 9 } 10 struct lmx 11 { 12 int l; 13 int w; 14 int h; 15 }; 16 lmx lm[500]; 17 bool is(lmx s,lmx t) 18 { 19 return s.l*s.w>t.l*t.w; 20 } 21 int p[100]; 22 int main() 23 { 24 int m,n,p1,test,i,cnt,j,maxi,ca=0; 25 while(scanf("%d",&test)&&test) 26 { 27 cnt=0; 28 ca++; 29 memset(p,0,sizeof(p)); 30 for(i=0;i<test;i++) 31 { 32 scanf("%d%d%d",&m,&n,&p1); 33 lm[cnt].l=m; //转换长宽高 34 lm[cnt].w=n; 35 lm[cnt].h=p1; 36 cnt++; 37 lm[cnt].l=m; 38 lm[cnt].w=p1; 39 lm[cnt].h=n; 40 cnt++; 41 lm[cnt].l=n; 42 lm[cnt].w=m; 43 lm[cnt].h=p1; 44 cnt++; 45 lm[cnt].l=n; 46 lm[cnt].w=p1; 47 lm[cnt].h=m; 48 cnt++; 49 lm[cnt].l=p1; 50 lm[cnt].w=n; 51 lm[cnt].h=m; 52 cnt++; 53 lm[cnt].l=p1; 54 lm[cnt].w=m; 55 lm[cnt].h=n; 56 cnt++; 57 } 58 sort(lm,lm+cnt,is); 59 for(i=0;i<cnt;i++) 60 p[i]=lm[i].h; //记录高度 61 maxi=p[0]; 62 for(i=1;i<cnt;i++) 63 for(j=0;j<i;j++) 64 if(lm[i].l<lm[j].l&&lm[i].w<lm[j].w) //一个箱子的长宽比一个小 65 { 66 if(p[i]<p[j]+lm[i].h) 67 p[i]=p[j]+lm[i].h; 68 if(p[i]>maxi) //更新最大值 69 maxi=p[i]; 70 } 71 printf("Case %d: maximum height = ",ca); 72 printf("%d\n",maxi); 73 } 74 return 0; 75 }
B Prison rearrangement POJ 1636
还是不是很懂这道题,传说是DFS&DP
代码:
1 #include<iostream> 2 using namespace std; 3 bool map[205][205],s1[205],s2[205],dp[205][205];int n,m,l,r; 4 void dfs(int x,int temp) 5 { 6 int i; 7 if(temp==1) 8 s1[x]=true; //标记 9 else 10 s2[x]=true; //标记 11 if(temp==1) //A牢 12 { 13 r++; 14 for(i=1;i<=n;i++) 15 if(map[i][x]&&!s2[i]) //地图被标记&&s2[]未被标记 16 dfs(i,2); //搜索B牢 17 } 18 else //B牢 19 { 20 l++; 21 for(i=1;i<=n;i++) 22 if(map[x][i]&&!s1[i]) 23 dfs(i,1); 24 } 25 } 26 int main() 27 { 28 int N,i,j,x,y,k; 29 cin>>N; 30 while(N--) 31 { 32 cin>>n>>m; 33 memset(map,false,sizeof(map)); 34 memset(dp,false,sizeof(dp)); 35 memset(s1,false,sizeof(s1)); 36 memset(s2,false,sizeof(s2)); 37 for(i=1;i<=m;i++) 38 { 39 cin>>x>>y; 40 map[x][y]=true; 41 } 42 dp[0][0]=true; 43 for(i=1;i<=n;i++) 44 { 45 if(s1[i]) 46 continue; 47 l=0;r=0; 48 dfs(i,1); 49 for(j=n/2;j>=l;j--) 50 for(k=n/2;k>=r;k--) 51 if(dp[j-l][k-r]) 52 dp[j][k]=true; 53 } 54 for(i=1;i<=n;i++) 55 { 56 if(s2[i]) 57 continue; 58 l=0;r=0; 59 dfs(i,2); 60 for(j=n/2;j>=l;j--) 61 for(k=n/2;k>=r;k--) 62 if(dp[j-l][k-r]) 63 dp[j][k]=true; 64 } 65 for(i=n/2;i>=0;i--) 66 if(dp[i][i]) 67 break; 68 printf("%d\n",i); 69 70 } 71 return 0; 72 73 }
这题其实很简单,主要是理解题意&灵活运用结构体,题目大意是,有个设计师想设计粗大家满意度最高的T-shirt,给出N个人,M个设计方案,选K种,再给出每个人对每种设计的满意度,输出最好的K个的编号,要求逆序输出编号。
代码: 78MS
1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 double a[1000][10005]; 6 int c[10005]; 7 class A 8 { 9 public: 10 double sum; 11 int num; 12 }b[10005]; 13 int cmp(A i,A j) 14 { 15 return i.sum>j.sum; 16 } 17 int main() 18 { 19 int m,n,k,i,j; 20 while(~scanf("%d%d%d",&m,&n,&k)) 21 { 22 for(i=0;i<m;i++) 23 for(j=0;j<n;j++) 24 scanf("%lf",&a[i][j]); //输入注意是double 25 for(i=0;i<n;i++) 26 { 27 b[i].num=i; 28 b[i].sum=0; 29 for(j=0;j<m;j++) 30 b[i].sum+=a[j][i]; //每一种设计的总分 31 } 32 sort(b,b+n,cmp); //分数排序 33 for(i=0;i<k;i++) 34 c[i]=b[i].num; 35 sort(c,c+k); //编号排序 36 for(i=k-1;i>0;i--) //逆序输出 37 printf("%d ",c[i]+1); 38 printf("%d\n",c[0]+1); 39 } 40 return 0; 41 }
这道题和LIS专场里的俄罗斯套娃很像,只不过这里同样的质量&长度可以放一起,所以,在排序的时候从大到小排序,在x相等的时候,y也是从大到小排序。
代码: 15MS
1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 class A 6 { 7 public: 8 int x; //质量 9 int y; //长度 10 int map; //标记 11 }a[5005]; 12 int cmp(A i,A j) 13 { 14 if(i.x==j.x) 15 return i.y>j.y; 16 else 17 return i.x>j.x; 18 } 19 int main() 20 { 21 int T,number,i,j,n; 22 scanf("%d",&T); 23 while(T--) 24 { 25 number=0; 26 scanf("%d",&n); 27 for(i=1;i<=n;i++) 28 { 29 scanf("%d%d",&a[i].x,&a[i].y); 30 a[i].map=0; //清零 31 } 32 int maxx; 33 sort(a+1,a+1+n,cmp); //排序 34 for(i=1;i<=n;i++) 35 if(a[i].map==0) 36 { 37 number++; 38 a[i].map=1; 39 maxx=a[i].y; 40 for(j=i+1;j<=n;j++) 41 if(a[j].map==0&&a[j].y<=maxx) 42 { 43 a[j].map=1; 44 maxx=a[j].y; 45 } 46 } 47 printf("%d\n",number); 48 } 49 return 0; 50 }
这道题就是个坑!!!!!天坑!!!!!!尼玛,我要他(从此不再)出道二分的题,居然出了这道神二分!!!!!!!!!题目并不难,只!是!压根看不懂题......
请容我再这详细讲下题......Orz
需要K根长度相等的电缆线 从已有的N条电缆线中剪切得来 求最长能获得多长的电缆线<-----------就是这样了.......
代码: 156 MS
1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 int main() 6 { 7 int i; 8 double mid,l,r,sum=0; 9 int m,n,y; 10 double a[10005]; 11 while(~scanf("%d%d",&m,&n)&&m&&n) 12 { 13 sum=0; 14 for(i=0;i<m;i++) 15 { 16 scanf("%lf",&a[i]); 17 sum+=a[i]; //求和.... 18 } 19 if(sum<n) //绳子不够长》。。。 20 printf("0.00\n"); 21 else 22 { 23 l=0; 24 r=sum/n; 25 mid=0; 26 while(r-l>1e-9) 27 { 28 y=0; //y要为整型.....因为绳子没有半根..... 29 mid=(l+r)/2; 30 for(i=0;i<m;i++) 31 y+=a[i]/mid; 32 if(y<n) 33 r=mid; 34 if(y>=n) //最坑爹的是这,这个=一定要放着才会对~!!!!!但是二分部应该随意放哪都可以么。。。。。 35 l=mid; 36 37 } 38 } 39 printf("%.2lf\n",mid); 40 } 41 return 0; 42 }