拼點遊戲 OpenJ_Bailian - 4005 (貪心)
阿新 • • 發佈:2018-11-09
https://vjudge.net/problem/OpenJ_Bailian-4005
這道題目和田忌賽馬問題極為類似, 本質思想都是: 如果我最好的比不過你, 就拿我的最差的比你最好的, 再拿我最好的比你其次好的
(1)如果B的大點數牌能贏A的大點數牌,則進行比較,否則執行(2);
(2)如果B的小點數牌能贏A的小點數牌,則進行比較,否則執行(3);
(3)如果B的小點數牌能平A的大點數牌,則進行比較,否則執行(4);
(4)將B的小點數牌和A的大點數牌進行比較;
//拼點遊戲 貪心 #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<vector> using namespace std; int n, input; vector<int> c, s, curC, curS; bool cmp(int a, int b) { return a > b; } int main() { while(cin >> n && n!=0){ c.clear(), s.clear(), curC.clear(), curS.clear(); for(int i = 1; i <= n; i++){ scanf("%d",&input); c.push_back(input); } for(int i = 1; i <= n; i++){ scanf("%d",&input); s.push_back(input); } sort(c.begin(), c.end(), cmp), sort(s.begin(), s.end(), cmp); curC = c, curS = s; //當前操作的c和s int maxAns = 0, minAns = 0; /*(1)如果B的大點數牌能贏A的大點數牌,則進行比較,否則執行(2); (2)如果B的小點數牌能贏A的小點數牌,則進行比較,否則執行(3); (3)如果B的小點數牌能和A的大點數牌,則進行比較,否則執行(4); (4)將B的小點數牌和A的大點數牌進行比較;*/ while(!curS.empty()){ int cmax = curC.front(), cmin = curC.back(), smax = curS.front(), smin = curS.back(); if(smax > cmax) maxAns += 3, curC.erase(curC.begin()), curS.erase(curS.begin()); else if(smin > cmin) maxAns += 3, curC.pop_back(), curS.pop_back(); else if(smin == cmax) maxAns += 2, curC.erase(curC.begin()), curS.pop_back(); else maxAns += 1, curC.erase(curC.begin()), curS.pop_back(); } curC = c, curS = s; while(!curC.empty()){ int cmax = curC.front(), cmin = curC.back(), smax = curS.front(), smin = curS.back(); if(cmax > smax) minAns += 1, curS.erase(curS.begin()), curC.erase(curC.begin()); else if(cmin > smin) minAns += 1, curS.pop_back(), curC.pop_back(); else if(cmin == smax) minAns += 2, curS.erase(curS.begin()), curC.pop_back(); else minAns += 3, curS.erase(curS.begin()), curC.pop_back(); } printf("%d %d\n",maxAns, minAns); } return 0; }
參考部落格: https://blog.csdn.net/ccf15068475758/article/details/53192208