日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

[JSOI2010] 满汉全席

發布時間:2024/9/5 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [JSOI2010] 满汉全席 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述


滿漢全席是中國最豐盛的宴客菜肴,有許多種不同的材料透過滿族或是漢族的料理方式,呈現在數量繁多的菜色之中。由于菜色眾多而繁雜,只有極少數博學多聞技藝高超的廚師能夠做出滿漢全席,而能夠烹飪出經過專家認證的滿漢全席,也是中國廚師最大的榮譽之一。世界滿漢全席協會是由能夠料理滿漢全席的專家廚師們所組成,而他們之間還細分為許多不同等級的廚師。

為了招收新進的廚師進入世界滿漢全席協會,將于近日舉辦滿漢全席大賽,協會派遣許多會員當作評審員,為的就是要在參賽的廚師之中,找到滿漢料理界的明日之星。

大會的規則如下:每位參賽的選手可以得到n 種材料,選手可以自由選擇用滿式或是漢式料理將材料當成菜肴。

大會的評審制度是:共有m 位評審員分別把關。每一位評審員對于滿漢全席有各自獨特的見解,但基本見解是,要有兩樣菜色作為滿漢全席的標志。如某評審認為,如果沒有漢式東坡肉跟滿式的涮羊肉鍋,就不能算是滿漢全席。但避免過于有主見的審核,大會規定一個評審員除非是在認為必備的兩樣菜色都沒有做出來的狀況下,才能淘汰一位選手,否則不能淘汰一位參賽者。

換句話說,只要參賽者能在這兩種材料的做法中,其中一個符合評審的喜好即可通過該評審的審查。如材料有豬肉,羊肉和牛肉時,有四位評審員的喜好如下表:

評審一 評審二 評審三 評審四 滿式牛肉 滿式豬肉 漢式牛肉 漢式牛肉 漢式豬肉 滿式羊肉 漢式豬肉 滿式羊肉

如參賽者甲做出滿式豬肉,滿式羊肉和滿式牛肉料理,他將無法滿足評審三的要求,無法通過評審。而參賽者乙做出漢式豬肉,滿式羊肉和滿式牛肉料理,就可以滿足所有評審的要求。

但大會后來發現,在這樣的制度下如果材料選擇跟派出的評審員沒有特別安排好的話,所有的參賽者最多只能通過部分評審員的審查而不是全部,所以可能會發生沒有人通過考核的情形。

如有四個評審員喜好如下表時,則不論參賽者采取什么樣的做法,都不可能通過所有評審的考核:

評審一 評審二 評審三 評審四 滿式羊肉 滿式豬肉 漢式羊肉 漢式羊肉 漢式豬肉 滿式羊肉 漢式豬肉 滿式豬肉

所以大會希望有人能寫一個程序來判斷,所選出的m 位評審,會不會發生 沒有人能通過考核的窘境,以便協會組織合適的評審團。

輸入輸出格式

輸入格式:

第一行包含一個數字 K,代表測試文件包含了K 組資料。

每一組測試資料的第一行包含兩個數字n 跟m(n≤100,m≤1000),代表有n 種材料,m 位評審員。

為方便起見,材料舍棄中文名稱而給予編號,編號分別從1 到n。

接下來的m 行,每行都代表對應的評審員所擁有的兩個喜好,每個喜好由一個英文字母跟一個數字代表,如m1 代表這個評審喜歡第1 個材料透過滿式料理做出來的菜,而h2 代表這個評審員喜歡第2 個材料透過漢式料理做出來的菜。

每個測試文件不會有超過50 組測試資料

輸出格式:

每筆測試資料輸出一行,如果不會發生沒有人能通過考核的窘境,輸出GOOD;否則輸出BAD(大寫字母)。

輸入輸出樣例

輸入樣例#1: 復制

1
2 4
h1 m2
m2 m1
h1 h2
m1 h2

輸出樣例#1: 復制

BAD

Solution

題目太長了,一句話題意,有一些原材料,每個材料可以選擇做兩個菜中的一個,你要選擇這些材料做菜,使得滿足所有的評委要求的菜品,每個評委有兩道菜,至少滿足一個就夠了。
2-SAT?怎么建圖?
我們把一到材料分成兩個點,\(i\)\(i+n\),看樣例,假設我們選了m1,我們就不能選h1了,因為一到材料只能做一道菜,那么意味著我們必須要選m2,因為要滿足第一個評委,所以m1向m2連邊,代表選了m1必須選m2,同理,我們選了h2,必須選h1,這還是對于第一個評委的要求。
就這樣建圖,最后跑一遍tarjan縮點,我們只需判斷\(i\)\(i+n\)是否在同一個強連通分量就行了,如果在同一個強連通分量,說明有沖突,根據邊的含義,這意味著同一個材料要同時做兩道菜,所以不合法。
代碼如下:

#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct node {int to,next; }a[4011]; int len,last[500],cnt,siz,vis[500],stack[500],dfn[500],low[510],top,belong[510]; void add(int a1,int a2) {a[++len].to=a2;a[len].next=last[a1];last[a1]=len; } void tarjan(int x) {dfn[x]=low[x]=++siz;vis[x]=1;stack[++top]=x;for(int i=last[x];i;i=a[i].next){int to=a[i].to;if(!dfn[to]){tarjan(to);low[x]=min(low[x],low[to]);}else if(vis[to]) low[x]=min(low[x],dfn[to]);}if(dfn[x]==low[x]){int to=0;cnt++;while(x!=to){to=stack[top--];vis[to]=0;belong[to]=cnt;}} } int main() {char s[5];int t;cin>>t;while(t--){int n,m,k1,k2;len=0;siz=0;top=0;memset(last,0,sizeof(last));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(belong,0,sizeof(belong));cin>>n>>m;for(int i=1;i<=m;i++){int p=0;scanf("%s",s);for(int j=1;j<strlen(s);j++)p=p*10+(s[j]^48);if(s[0]=='h')k1=p;else k1=p+n;p=0;scanf("%s",s);for(int j=1;j<strlen(s);j++)p=p*10+(s[j]^48);if(s[0]=='h')k2=p;else k2=p+n;if(k1<=n) add(k1+n,k2);else add(k1-n,k2);if(k2<=n) add(k2+n,k1);else add(k2-n,k1);}for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);int flag=1;for(int i=1;i<=n;i++)if(belong[i]==belong[i+n])flag=0;if(flag) printf("GOOD\n");else printf("BAD\n");} }

博主蒟蒻,可以隨意轉載,但必須附上原文鏈接k-z-j。

轉載于:https://www.cnblogs.com/kzj-pwq/p/9507567.html

總結

以上是生活随笔為你收集整理的[JSOI2010] 满汉全席的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。