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

Codeforces Round #674 (Div. 3)——E. Rock, Paper, Scissors
2020/9/28
有两种情况(不包括我的垃圾爆搜)

  1. 与题解相同,共有6种赢不了的情况——石头vs石头,石头vs布,剪刀vs剪刀,剪刀vs石头,布vs布,布vs剪刀。将这6种情况全排列得到720种情况,对于每种顺序算出来每种情况贪心情况的值,对所有取max即可得到最多赢不了几场。具体代码看题解。
  2. 就是很多大佬用的max(0,a1-b1-b3)+max(0,a2-b1-b2)+max(0,a3-b2-b3)来求最小值。也就是下面代码所求。(具体证明过程不清楚,题解下的评论区有英文讨论,感兴趣可以去研究)——暴力万岁!
    最后!!!!!!!!!!!!!!!!!!!!!!!!
    展示一手绝活,把一个这样的代码:
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long int
#define pll pair<ll,ll>
int main(){
    
    
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n;
    cin>>n;
    ll a[3],b[3];
    for(int i=0;i<3;i++){
    
    
    	cin>>a[i];
	}
    for(int i=0;i<3;i++){
    
    
    	cin>>b[i];
	}
	ll ans_min=0;
	ans_min += max(a[0]-n+b[1],(ll)0);
	ans_min += max(a[1]-n+b[2],(ll)0);
	ans_min += max(a[2]-n+b[0],(ll)0);
	cout<<ans_min<<" ";
	ll ans_max=0;
	ans_max += min(a[0],b[1]);
	ans_max += min(a[1],b[2]);
	ans_max += min(a[2],b[0]);
    cout<<ans_max<<" ";
    return 0;
}

写成了这样:

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mp make_pair
#define pb push_back
#define G 6.67430*1e-11
#define  rd read()
#define pi 3.1415926535
using namespace std;
const ll mod = 998244353;
const int MAX1 = 100005;
const int MAX2 = 300005;
inline ll read() {
    
    
    ll x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch>'9') {
    
    
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
    
    
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}
ll fpow(ll a, ll b)
{
    
    
    ll ans = 1;
    while (b)
    {
    
    
        if (b & 1)ans = ans * a % mod;
        b >>= 1;
        a = a * a % mod;
    }
    return ans;
}
int t1[3], t2[3];
ll gcd(ll a, ll b) {
    
     return !b ? a : gcd(b, a % b); }
ll a, b, c, x, y, z;
int ans1(int j, int k, int p)
{
    
    
    t1[0] = a, t1[1] = b, t1[2] = c, t2[0] = x, t2[1] = y, t2[2] = z;
    int ans = min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]);
    int tmp = min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]) - min(t2[(j - 1 + 3) % 3], min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]));
    t2[(j - 1 + 3) % 3] -= min(t2[(j - 1 + 3) % 3], min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]));
    t2[j] -= tmp;
    ans += min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]);
    tmp = min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]) - min(t2[k], min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]));
    t2[k] -= min(t2[k], min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]));
    t2[(k - 1 + 3) % 3] -= tmp;
    ans += min(t1[p], t2[p] + t2[(p - 1 + 3) % 3]);
    return ans;
}
int ans2(int j, int k, int p)
{
    
    
    t1[0] = a, t1[1] = b, t1[2] = c, t2[0] = x, t2[1] = y, t2[2] = z;
    int ans = min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]);
    int tmp = min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]) - min(t2[j], min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]));
    t2[j] -= min(t2[j], min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]));
    t2[(j - 1 + 3) % 3] -= tmp;
    ans += min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]);
    tmp = min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]) - min(t2[k], min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]));
    t2[k] -= min(t2[k], min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]));
    t2[(k - 1 + 3) % 3] -= tmp;
    ans += min(t1[p], t2[p] + t2[(p - 1 + 3) % 3]);
    return ans;
}
int ans3(int j, int k, int p)
{
    
    
    t1[0] = a, t1[1] = b, t1[2] = c, t2[0] = x, t2[1] = y, t2[2] = z;
    int ans = min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]);
    int tmp = min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]) - min(t2[j], min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]));
    t2[j] -= min(t2[j], min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]));
    t2[(j - 1 + 3) % 3] -= tmp;
    ans += min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]);
    tmp = min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]) - min(t2[(k - 1 + 3) % 3], min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]));
    t2[(k - 1 + 3) % 3] -= min(t2[(k - 1 + 3) % 3], min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]));
    t2[k] -= tmp;
    ans += min(t1[p], t2[p] + t2[(p - 1 + 3) % 3]);
    return ans;
}
int ans4(int j, int k, int p)
{
    
    
    t1[0] = a, t1[1] = b, t1[2] = c, t2[0] = x, t2[1] = y, t2[2] = z;
    int ans = min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]);
    int tmp = min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]) - min(t2[(j - 1 + 3) % 3], min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]));
    t2[(j - 1 + 3) % 3] -= min(t2[(j - 1 + 3) % 3], min(t1[j], t2[j] + t2[(j - 1 + 3) % 3]));
    t2[j] -= tmp;
    ans += min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]);
    tmp = min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]) - min(t2[(k - 1 + 3) % 3], min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]));
    t2[(k - 1 + 3) % 3] -= min(t2[(k - 1 + 3) % 3], min(t1[k], t2[k] + t2[(k - 1 + 3) % 3]));
    t2[k] -= tmp;
    ans += min(t1[p], t2[p] + t2[(p - 1 + 3) % 3]);
    return ans;
}
int temp[6][3] = {
    
     {
    
    0,1,2},{
    
    0,2,1},{
    
    1,0,2},{
    
    1,2,0},{
    
    2,0,1},{
    
    2,1,0} };

int main()
{
    
    

    int n = rd;
    t1[0] = rd, t1[1] = rd, t1[2] = rd, t2[0] = rd, t2[1] = rd, t2[2] = rd;
    int ma = 0;
    a = t1[0], b = t1[1], c = t1[2], x = t2[0], y = t2[1], z = t2[2];
    for (int i = 0; i < 6; i++)
    {
    
    
        int j = temp[i][0], k = temp[i][1], p = temp[i][2];
        ma = max(ma, max({
    
     ans1(j,k,p), ans2(j,k,p), ans3(j,k,p), ans4(j,k,p) }));
    }
    cout << n - ma << ' '
        << min(a, y) + min(b, z) + min(c, x) <<
        endl;
    return 0;
}

然后还AC了。。。我需要反思/。。。我就说Div3怎么这么难。。。
原因是我直接暴力把6种顺序的4种情况都搜了一遍。。。(而且搜的很不优雅,题解也是搜但是代码优雅多了)

猜你喜欢

转载自blog.csdn.net/ylwhxht/article/details/108859654