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\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 }

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\n",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\n",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\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 }

你可能感兴趣的:(8月7日小练)