zoukankan      html  css  js  c++  java
  • 8-7-Exercise

    链接:第二次小练

    这次是我们这组出的题目~我出了一道......B-Prison rearrangement,感觉有点复杂~不过其实题目想通了还是很简单的......

    @荆红浅醉出的是A、C、D,@从此不再出的是E——一道很尼玛的二分......题目难懂啊~~~

    这一次很凑巧,大家出的题目的题面都是英文而且....比较长......不过这都是巧合.....= =

    A.Monkey and Banana HDU 1069

    B.Prison rearrangement POJ 1636

    题意:就是两个监狱换犯人,他们想换一半,但是发现两个监狱的有部分犯人不能放在一个监狱里,否则会有危险,就问在尽可能换一半犯人前提下,最多能换多少犯人~(就觉得这个想换犯人的长官是没事找抽型……= =)

    方法简析:先是用DFS搜索两个监狱,看换犯人的话有多少是要同时换的(即不能在一个监狱)。【注:DFS要搜索两遍,一遍是从A监狱,一遍是从B监狱,这是要保证都不能在同意监狱的被搜索到~】再找出最多要换的人数~

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 bool vis[2][205],map[205][205],dp[205][205];  //vis[0][i]代表的是A监狱i号犯人;vis[1][i]代表的是B号监狱i号犯人~~~;map记录的是两个监狱里的犯人是否有关联
     7 int m,r,asize,bsize;              //asize,bsize分别代表A、B监狱要换的人数
     8 
     9 void DFS(int p,int id)
    10 {
    11     vis[p][id]=1;
    12     int i;
    13     if(p==0)
    14     {
    15         asize++;
    16         for(i=1;i<=m;i++)
    17             if(!vis[1][i] && map[id][i])    //若未标记,则搜索与该点不能呆在一起的犯人~
    18                 DFS(1,i);
    19     }
    20     else
    21     {
    22         bsize++;
    23         for(i=1;i<=m;i++)
    24             if(!vis[0][i] && map[i][id])    //若未被标记,则搜索与该点不能呆在一起的犯人~~
    25                 DFS(0,i);
    26     }
    27 }
    28 
    29 void bag()
    30 {
    31     dp[0][0]=true;
    32     for(int i=m/2;i>=asize;i--)
    33         for(int j=m/2;j>=bsize;j--)
    34         if(dp[i][j] || dp[i-asize][j-bsize]) dp[i][j]=true;    //对搜索到的两个监狱的人数进行标记~
    35 }
    36 
    37 int main()
    38 {
    39     int t,a,b,i;
    40     scanf("%d",&t);
    41     while(t--)
    42     {
    43         memset(vis,0,sizeof(vis));
    44         memset(map,0,sizeof(map));
    45         memset(dp,0,sizeof(dp));
    46         scanf("%d%d",&m,&r);
    47         for(i=0;i<r;i++)
    48         {
    49             scanf("%d%d",&a,&b);
    50             map[a][b]=1;
    51         }
    52         for(i=1;i<=m;i++)
    53             if(!vis[0][i])
    54         {
    55             asize=0;
    56             bsize=0;
    57             DFS(0,i);
    58             bag();
    59         }
    60         for(i=1;i<=m;i++)
    61             if(!vis[1][i])
    62         {
    63             asize=0;
    64             bsize=0;
    65             DFS(1,i);
    66             bag();
    67         }
    68         for(i=m/2;i>=0;i--)
    69             if(dp[i][i])                 /*若在前面搜索中出现A、B两个监狱搜索的人数一样多,并人数小于m/2,即该人数是符合要求的,那么就输出该人数~从后面开始搜是为了保证得到的是最大值*/
    70         {
    71             printf("%d
    ",i);
    72             break;
    73         }
    74     }
    75     return 0;
    76 }

    //memory:228KB  time:79ms

    C.Design T-Shirt HDU 1031

    水到爆的题目..............没什么好讲的~

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 class Shuchu
     8 {
     9 public:
    10     double sum;
    11     int id;
    12 }a[1000];
    13 
    14 bool comp(Shuchu q,Shuchu w)
    15 {
    16     if(q.sum==w.sum)
    17         return q.id<w.id;
    18     return q.sum>w.sum;
    19 }
    20 bool cmp(Shuchu q,Shuchu w)
    21 {
    22     return q.id>w.id;
    23 }
    24 
    25 double b[1000][1000];
    26 
    27 int main()
    28 {
    29     int p,e,ne,i,j;
    30 
    31     while(scanf("%d%d%d",&p,&e,&ne)!=EOF)
    32     {
    33         for(i=0;i<p;i++)
    34             for(j=0;j<e;j++)
    35             scanf("%lf",&b[i][j]);
    36         memset(a,0,sizeof(a));
    37         for(i=0;i<e;i++)
    38             for(j=0;j<p;j++)
    39             {
    40                 a[i].sum+=b[j][i];
    41                 a[i].id=i+1;
    42             }
    43         sort(a,a+e,comp);
    44         sort(a,a+ne,cmp);
    45         for(i=0;i<ne-1;i++)
    46             printf("%d ",a[i].id);
    47         printf("%d
    ",a[ne-1].id);
    48     }
    49     return 0;
    50 }
    View Code

    //memory:720KB  time:62ms

    D.Wooden Sticks HDU 1051

    与前不久做的俄罗斯套娃的题目十分相似~WA了几次是没有考虑到,俄罗斯套娃中相同的娃娃不能套在一起,但是这道题是可以的~但我就完全按照俄罗斯套娃做了,结果.......= =内牛满面啊.....

    代码:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 class Point
     8 {
     9 public:
    10     int x,y,id;
    11 }a[5050];
    12 
    13 bool comp(Point q,Point w)
    14 {
    15     if(q.x==w.x)
    16         return q.y>w.y;
    17     return q.x>w.x;
    18 }
    19 
    20 int main()
    21 {
    22     int t,n,i,j,number,minn;
    23     scanf("%d",&t);
    24     while(t--)
    25     {
    26         memset(a,0,sizeof(a));
    27         scanf("%d",&n);
    28         for(i=0;i<n;i++)
    29             scanf("%d%d",&a[i].x,&a[i].y);
    30         sort(a,a+n,comp);
    31         number=0;
    32         minn=0;
    33         for(i=0;i<n;i++)
    34             if(a[i].id==0)
    35             {
    36                 a[i].id=1;
    37                 number++;
    38                 minn=a[i].y;
    39                 for(j=i+1;j<n;j++)
    40                 {
    41                     if(a[j].id==0 && a[j].y<=minn )
    42                     {
    43                         a[j].id=1;
    44                         minn=a[j].y;
    45                     }
    46                 }
    47             }
    48         printf("%d
    ",number);
    49     }
    50     return 0;
    51 }

    //memory:288KB time:15ms

    E.Cable master HDU 1551

    //神二分啊~刚开始听说是二分,自己还小庆幸了一下.......结果.......尼玛题目都看不懂啊.......= =

  • 相关阅读:
    Android带头像的用户注册页面
    Android——四种AterDialog
    Android Studio如何显示行号
    月下载量上千次的APP源码分享
    Android——列表视图(ListView)
    Android——列表选择框(Spinner)
    Android——按钮的事件监听
    ACM——第几天
    Android——控制UI界面
    Android——将图片加入到系统相册里面
  • 原文地址:https://www.cnblogs.com/teilawll/p/3247123.html
Copyright © 2011-2022 走看看