• [Usaco2019 Feb]The Great Revegetation


    题目:

    The Great Revegetation
    (grass.cpp/in/out 1s 256M)
    长时间的干旱使得Farmer John的N块草地上牧草匮乏。随着雨季即将到来,现在应当是重新种植的时候了。在Farm
    er John的储物棚里有四个桶,每个桶里装着一种不同的草种。他想要在每块草地上播种其中一种草。作为一名奶
    农,Farmer John想要确保他的每头奶牛都能得到丰富的食谱。他的M头奶牛每一头都有两块喜爱的草地,他想要确
    保这两块草地种植不同种类的草,从而每头奶牛都可以有两种草可供选择。Farmer John知道没有一块草地受到多
    于3头奶牛的喜爱。
    请帮助Farmer John选择每块草地所种的草的种类,使得所有奶牛的营养需求都得到满足。
    Input
    输入的第一行包含N(2≤N≤100)和M(1≤M≤150)。
    以下M行,每行包含两个范围为1…N的整数,为Farmer John的一头奶牛喜欢的两块草地。
    Output
    输出一个N位数,每一位均为1…4之一,表示每一块草地上所种的草的种类。
    第一位对应草地1的草的种类,第二位对应草地2,以此类推。如果有多种可行的解,只需输出所有解中最小的N位数。
    Sample Input
    5 6
    4 1
    4 2
    4 3
    2 5
    1 2
    1 5
    Sample Output
    12133

    法一

    递归dfs,不断查找当前位数可摆放的最小值。

    先排序,保证从上到下,从左至右为递增状态

    k表示位数,side表示当前可摆放的最小值

    flag[k][i]表示第k位上能否放i这个数

    如果左边的值已经放好了,那么右边的就不能放左边的值了,flag[node[u].y][ans]=false;

    因为草地的种类和在[1,N]之间,所以判断当前最小值是否为当前的位数(保证第一位即为1)

    code:

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 #define fill(a,b) memset(a,b,sizeof(a))
     4 using namespace std;
     5 bool flag[2100][5];
     6 int n,m;
     7 struct kk{int x,y;}node[2100];
     8 int cmp(kk A,kk B){return A.x<B.x;}
     9 void dfs(int k,int side){
    10     int u=0,ans;
    11     if (k>n) return ;
    12     for (int i=1;i<=4;i++)
    13         if (flag[k][i]){ans=i;break;}
    14     printf("%d",ans);
    15     for (u=side;node[u].x==k;u++){
    16         flag[node[u].y][ans]=false;
    17     }
    18     dfs(k+1,u);
    19 }
    20 int main(){
    21     //freopen("grass.in","r",stdin);
    22     //freopen("grass.out","w",stdout);
    23     scanf("%d%d",&n,&m);
    24     fill(flag,true);
    25     for (int i=1;i<=m;i++){
    26         scanf("%d%d",&node[i].x,&node[i].y);
    27         if (node[i].x>node[i].y) swap(node[i].x,node[i].y);
    28     }
    29     sort(node+1,node+m+1,cmp);
    30     dfs(1,1);
    31     return 0;
    32 }/*
    33 6 6
    34 1 2
    35 2 3
    36 3 4
    37 4 5
    38 1 5
    39 1 6
    40 */

    法二:

    类似于法一,直接三个for循环模拟

    code:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5   int N, M;
     6   int A[151], B[151], G[101];
     7   cin >> N >> M;
     8   for (int i=0; i<M; i++) { 
     9     cin >> A[i] >> B[i];
    10     if (A[i] > B[i]) swap (A[i], B[i]);
    11   }
    12   for (int i=1; i<=N; i++) {
    13       int g;
    14     for (g = 1; g <= 4; g++) {
    15       bool ok = true;
    16       for (int j=0; j<M; j++){
    17         if (B[j] == i && G[A[j]] == g){
    18          ok = false;
    19                  
    20         }
    21         //cout<<"G[A[j]]= "<<G[A[j]]<<" g= "<<g<<" i= "<<i<<" j= "<<j<<" A[j]= "<<A[j]<<" B[j]= "<<B[j]<<endl;
    22     }
    23       if (ok) break;
    24     }
    25     G[i] = g;
    26     //cout<<"G[i]= "<<G[i]<<endl;
    27     cout << g;
    28   }
    29   cout << "
    ";
    30   return 0;
    31 }
  • 相关阅读:
    2019春第一次课程设计实验报告
    第十二周编程总结
    第五周课程总结&试验报告(三)
    第四周课程总结&实验报告(二)
    第三周课程总结&实验报告一
    第二周JAVA学习总结
    2019春总结作业
    对我影响最大的老师
    2019第一周编程总结
    2019春第十二周作业
  • 原文地址:https://www.cnblogs.com/nlyzl/p/11679781.html
Copyright © 2020-2023  润新知