[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 << "\n";
30   return 0;
31 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM