8月7日小练

网址:CSUST练习2

这次的小练是我们这组出的题,我出了3道:A,C,DTeilwal出了一道:B,从此不再 出了一道:E,然后这次题目在群里遭到几乎全体的吐槽.....Orz......都是英文题,而且都很长.....这绝对是巧合!恩,巧合~╮(╯▽╰)╭

Monkey and Banana   HDU 1069

猴子要摘香蕉,有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
",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
",i);
69   
70  }
71  return 0;
72    
73 }

C   Design T-Shirt   HDU 1031

这题其实很简单,主要是理解题意&灵活运用结构体,题目大意是,有个设计师想设计粗大家满意度最高的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
",c[0]+1);
39     }
40     return 0;
41 }

D   Wooden Sticks   HDU 1051

这道题和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
",number);
48     }
49     return 0;
50 }

E   Cable master   HDU 1551

这道题就是个坑!!!!!天坑!!!!!!尼玛,我要他(从此不再)出道二分的题,居然出了这道神二分!!!!!!!!!题目并不难,只!是!压根看不懂题......

请容我再这详细讲下题......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
");
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
",mid);
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/riddle/p/3246921.html