B4010 菜肴制作 拓扑排序(附随机跳题代码)
生活随笔
收集整理的這篇文章主要介紹了
B4010 菜肴制作 拓扑排序(附随机跳题代码)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
今天寫了一個自己的隨機(jī)跳題小程序,第一次試發(fā)現(xiàn)跳的全是不可做題,但是在周圍我一眼看見了這個題,不能說一眼看出來,但是也是比較有思路,所以就做他了!
做得比較順利,做完之后美滋滋,突然發(fā)現(xiàn)樣例第三組過不了。。。然后發(fā)現(xiàn)自己算法有問題。。。GG,又想了一個超復(fù)雜的算法,剛開始寫就放棄了,根本沒法寫。
于是看題解(本來以為自己能A),就看了一行就明白了,只要倒著存邊再倒著輸出就行了!!!QAQ!!
跳題代碼:
#include<iostream> #include<cstdio> #include<cmath> #include<ctime> #include<queue> #include<algorithm> #include<cstring> using namespace std; #define duke(i,a,n) for(int i = a;i <= n;i++) #define lv(i,a,n) for(int i = a;i >= n;i--) #define clean(a) memset(a,0,sizeof(a)) const int INF = 1 << 30; typedef long long ll; typedef double db; template <class T> void read(T &x) {char c;bool op = 0;while(c = getchar(), c < '0' || c > '9')if(c == '-') op = 1;x = c - '0';while(c = getchar(), c >= '0' && c <= '9')x = x * 10 + c - '0';if(op) x = -x; } template <class T> void write(T x) {if(x < 0) putchar('-'), x = -x;if(x >= 10) write(x / 10);putchar('0' + x % 10); } int main() {int m,d;time_t t;read(m);read(d);srand((unsigned int)time(NULL));int f = m * d * rand() % 5010;if(f > 1000)printf("%d\n",f);elseprintf("%d\n",f + 1000);return 0; }題干:
Description知名美食家小 A被邀請至ATM 大酒店,為其品評菜肴。 ATM 酒店為小 A 準(zhǔn)備了 N 道菜肴,酒店按照為菜肴預(yù)估的質(zhì)量從高到低給予 1到N的順序編號,預(yù)估質(zhì)量最高的菜肴編號為1。由于菜肴之間口味搭配的問題, 某些菜肴必須在另一些菜肴之前制作,具體的,一共有 M 條形如“i 號菜肴‘必須’ 先于 j 號菜肴制作”的限制,我們將這樣的限制簡寫為<i,j>。現(xiàn)在,酒店希望能求 出一個最優(yōu)的菜肴的制作順序,使得小 A能盡量先吃到質(zhì)量高的菜肴:也就是說, (1)在滿足所有限制的前提下,1 號菜肴“盡量”優(yōu)先制作;(2)在滿足所有限制,1 號菜肴“盡量”優(yōu)先制作的前提下,2號菜肴“盡量”優(yōu)先制作;(3)在滿足所有限 制,1號和2號菜肴“盡量”優(yōu)先的前提下,3號菜肴“盡量”優(yōu)先制作;(4)在滿 足所有限制,1 號和 2 號和 3 號菜肴“盡量”優(yōu)先的前提下,4 號菜肴“盡量”優(yōu) 先制作;(5)以此類推。 例1:共4 道菜肴,兩條限制<3,1>、<4,1>,那么制作順序是 3,4,1,2。例2:共 5道菜肴,兩條限制<5,2>、 <4,3>,那么制作順序是 1,5,2,4,3。例1里,首先考慮 1, 因?yàn)橛邢拗?/span><3,1>和<4,1>,所以只有制作完 3 和 4 后才能制作 1,而根據(jù)(3),3 號 又應(yīng)“盡量”比 4 號優(yōu)先,所以當(dāng)前可確定前三道菜的制作順序是 3,4,1;接下來 考慮2,確定最終的制作順序是 3,4,1,2。例 2里,首先制作 1是不違背限制的;接 下來考慮 2 時有<5,2>的限制,所以接下來先制作 5 再制作 2;接下來考慮 3 時有 <4,3>的限制,所以接下來先制作 4再制作 3,從而最終的順序是 1,5,2,4,3。 現(xiàn)在你需要求出這個最優(yōu)的菜肴制作順序。無解輸出“Impossible!” (不含引號, 首字母大寫,其余字母小寫) Input第一行是一個正整數(shù)D,表示數(shù)據(jù)組數(shù)。 接下來是D組數(shù)據(jù)。 對于每組數(shù)據(jù): 第一行兩個用空格分開的正整數(shù)N和M,分別表示菜肴數(shù)目和制作順序限 制的條目數(shù)。 接下來M行,每行兩個正整數(shù)x,y,表示“x號菜肴必須先于y號菜肴制作” 的限制。(注意:M條限制中可能存在完全相同的限制) Output輸出文件僅包含 D 行,每行 N 個整數(shù),表示最優(yōu)的菜肴制作順序,或 者”Impossible!”表示無解(不含引號)。 Sample Input 3 5 4 5 4 5 3 4 2 3 2 3 3 1 2 2 3 3 1 5 2 5 2 4 3 Sample Output 1 5 3 4 2 Impossible! 1 5 2 4 3代碼:
#include<iostream> #include<cstdio> #include<cmath> #include<ctime> #include<queue> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define duke(i,a,n) for(int i = a;i <= n;i++) #define lv(i,a,n) for(int i = a;i >= n;i--) #define clean(a) memset(a,0,sizeof(a)) const int INF = 1 << 30; typedef long long ll; typedef double db; template <class T> void read(T &x) {char c;bool op = 0;while(c = getchar(), c < '0' || c > '9')if(c == '-') op = 1;x = c - '0';while(c = getchar(), c >= '0' && c <= '9')x = x * 10 + c - '0';if(op) x = -x; } template <class T> void write(T x) {if(x < 0) putchar('-'), x = -x;if(x >= 10) write(x / 10);putchar('0' + x % 10); } int len = 0,ru[100010],chu[100010],lst[100010]; int n,m,k,x,y,w,ans[100010],num = 0; priority_queue <int> qu; //vector <int> ve[100010]; bool vis[100010]; struct node {int l,r,nxt; }a[200010]; void add(int l,int r) {a[++len].l = l;a[len].r = r;a[len].nxt = lst[l];lst[l] = len;chu[l]++;ru[r]++; } void clean_queue() {priority_queue <int> p;swap(p,qu); } int ok = 1,emm = 1; int main() {read(k);while(k--){clean(vis);clean(lst);clean(ru);clean(chu);clean(ans);clean_queue();len = 0;ok = 1;emm = 1;num = 0;read(n);read(m);duke(i,1,m){read(x);read(y);add(y,x);}duke(i,1,n){if(ru[i] == 0)qu.push(i),emm = 0;}if(emm != 0){printf("Impossible!\n");continue;}while(!qu.empty()){x = qu.top();qu.pop();vis[x] = 1;for(int p = lst[x];p;p = a[p].nxt){int r = a[p].r;ru[r]--;if(ru[r] == 0)qu.push(r);}ans[++num] = x;} if(ans[n] != 0){lv(i,n,1)printf("%d ",ans[i]);printf("\n");}else{printf("Impossible!\n");continue;}}return 0; } /* 3 5 4 5 4 5 3 4 2 3 2 3 3 1 2 2 3 3 1 5 2 5 2 4 3 */?
轉(zhuǎn)載于:https://www.cnblogs.com/DukeLv/p/9499099.html
總結(jié)
以上是生活随笔為你收集整理的B4010 菜肴制作 拓扑排序(附随机跳题代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 下添加,修改,删除路由
- 下一篇: imx6的kernel3.4.15启动流