【CCSP真题】第一题 摘水果(拓扑排序)
生活随笔
收集整理的這篇文章主要介紹了
【CCSP真题】第一题 摘水果(拓扑排序)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原題鏈接
思路:
對每棵樹進(jìn)行拓?fù)渑判?#xff0c;同一時間可以采摘的進(jìn)行暴力即可,代碼寫得有點丑陋…
#include<iostream> #include<vector> #include<queue> using namespace std; #define ll long longint val[1005]; vector<int>ve[1005]; int indeg[1005]; queue<int>q1,q2; vector<int>ans; int main() {int n;scanf("%d",&n);for(int i=1;i<=2*n;i++){scanf("%d",&val[i]);}for(int i=1;i<=2*n;i++){int t;scanf("%d",&t);if(t==0)continue;ve[i].push_back(t);indeg[t]++;}for(int i=1;i<=n;i++){if(indeg[i]==0)q1.push(i);}for(int i=n+1;i<=2*n;i++){if(indeg[i]==0)q2.push(i);}for(int i=0;i<n;i++){int ap=-1,pr=-1;int q1SIZE=q1.size(),q2SIZE=q2.size();for(int j=0;j<q1SIZE;j++){int apple=q1.front();q1.pop();for(int k=0;k<q2SIZE;k++){int pear=q2.front();q2.pop();q2.push(pear);if(ap==-1){ap=apple;pr=pear;}else if((val[apple]^val[pear])>(val[ap]^val[pr])){ap=apple;pr=pear;}else if((val[apple]^val[pear])==(val[ap]^val[pr])){if(val[apple]>val[ap]){ap=apple;pr=pear;}else if(val[apple]==val[ap]){if(apple>ap){ap=apple;pr=pear;}else if(apple==ap){if(pear>pr){ap=apple,pr=pear;}}}}}q1.push(apple);}ans.push_back(val[ap]^val[pr]);for(int j=0;j<q1SIZE;j++){int tmp=q1.front();q1.pop();if(tmp==ap){for(int k=0;k<ve[tmp].size();k++){indeg[ve[tmp][k]]--;if(indeg[ve[tmp][k]]==0){q1.push(ve[tmp][k]);}}}else{q1.push(tmp);}}for(int j=0;j<q2SIZE;j++){int tmp=q2.front();q2.pop();if(tmp==pr){for(int k=0;k<ve[tmp].size();k++){indeg[ve[tmp][k]]--;if(indeg[ve[tmp][k]]==0){q2.push(ve[tmp][k]);}}}else{q2.push(tmp);}}}for(int i=0;i<n;i++){if(i!=n-1)cout<<ans[i]<<" ";else cout<<ans[i]<<'\n';} }總結(jié)
以上是生活随笔為你收集整理的【CCSP真题】第一题 摘水果(拓扑排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 注会考试能用计算机吗,cpa机考能带计算
- 下一篇: IDEA找不到SVN(Subversio