Codeforces B. Ternary Sequence (思维 / 贪心) (Round #665 Div.2)

传送门

题意: 给出两个只由0,1,2组成的数组a,b;可通过一种计算规则得到相应的数组c:

  • c[i] = a[i]*b[i] , a[i] > b[i]
  • c[i] = 0 , a[i] == b[i]
  • c[i] = -a[i]*b[i], a[i] < b[i]

现可将a,b进行特定的排序,使得sum©得到最大值,并求出该max。
Codeforces B. Ternary Sequence (思维 / 贪心) (Round #665 Div.2)_第1张图片
思路:

  • 正贡献(+2)的情况,a[i] > b[i],那么就要认a中的2尽量多的对应b的1.
  • 无贡献的情况,a[i]为0或b[i]为0,所以让a的0尽量多的对应b的2,消耗掉b中的大元素。
  • 负贡献(-2)的情况,最后若还有避免不了的a中的1和b中的2相对应,那就再加上这些负贡献。

代码实现:

#include
#define endl '\n'
#define null NULL
#define ll long long
#define int long long
#define pii pair
#define lowbit(x) (x &(-x))
#define ls(x) x<<1
#define rs(x) (x<<1+1)
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int way[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
using namespace std;
const int  inf = 0x7fffffff;
const double PI = acos(-1.0);
const double eps = 1e-6;
const ll   mod = 1e9 + 7;
const int  N = 2e5 + 5;

int t, n, x1, y1, z1, x2, y2, z2;

signed main(){
	IOS;
	cin >> t;
	while(t --){
		cin >> x1 >> y1 >> z1;
		cin >> x2 >> y2 >> z2;
		int ans = 0;
		int cnt1 = min(z1,y2);
		ans += cnt1*2;
		z1 -= cnt1; y2 -= cnt1;
		int cnt2 = min(x1,z2);
		x1 -= cnt2; z2 -= cnt2;
		if(z2 && z1 < z2) ans -= (z2-z1)*2;
		cout << ans << endl;
	}
    return 0;
}

你可能感兴趣的:(比赛&训练)