1. 程式人生 > 實用技巧 >Codeforces Round #674 (Div. 3) E. Rock, Paper, Scissors

Codeforces Round #674 (Div. 3) E. Rock, Paper, Scissors

題目連結:https://codeforces.ml/problemset/problem/1426/E
題意:A出石頭a1次,出剪刀a2次,出布a3

B出石頭b1次,出剪刀b2次,出布b3

問Alice最少贏多少次,最多贏多少次。

思路: 要不贏的情況 有平局和輸掉 但是因為這是一個環所以並不能貪心來確定怎麼最優

所以考慮直接列舉所有的情況, 可以得到六種所有輸掉的情況 那麼答案不同的時候就是這六種

情況順序不同的時候 所以用next permutation 來得到六種情況的順序 剩下的場數就是輸的場數

 1 #include<bits/stdc++.h>
 2 using namespace
std; 3 #define pb push_back 4 #define ll long long 5 const int maxn=1e5+10; 6 const int mod=1e9+7; 7 int a[4],b[4],c[4],d[4]; 8 9 10 int ans1=2e9; 11 int ans2=0; 12 13 14 int main() 15 { 16 ios::sync_with_stdio(0); 17 cin.tie(0); 18 int n; 19 cin>>n; 20 for(int i=1;i<=3
;i++) 21 { 22 cin>>a[i]; 23 } 24 for(int i=1;i<=3;i++) 25 cin>>b[i]; 26 vector<pair<int,int>>cnt; 27 cnt.pb({1,1}); 28 cnt.pb({1,3}); 29 cnt.pb({3,3}); 30 cnt.pb({3,2}); 31 cnt.pb({2,2}); 32 cnt.pb({2,1}); 33 sort(cnt.begin(),cnt.end());
34 do 35 { 36 for(int i=1;i<=3;i++) 37 c[i]=a[i],d[i]=b[i]; 38 for(auto &v:cnt) 39 { 40 int temp=min(c[v.first],d[v.second]); 41 c[v.first]-=temp; 42 d[v.second]-=temp; 43 } 44 int sum=c[1]+c[2]+c[3]; 45 ans1=min(ans1,sum); 46 } 47 while(next_permutation(cnt.begin(),cnt.end())); 48 ans2=min(a[1],b[2])+min(a[2],b[3])+min(a[3],b[1]); 49 cout<<ans1<<" "<<ans2<<'\n'; 50 }
View Code