感觉很难想。
如果你直接想的话,你就会发现有很多做法可以选择,而你根本不知道应该选哪个。
这时候可以先假设鲍勃已经取走了爱丽丝的所有的颜色的弹珠,(并且以每个颜色一个弹珠的代价)。
这时候每一项得分就是
S
i
=
−
(
b
i
−
1
)
S_i = -(b_i - 1)
Si=−(bi−1)。
然后我们使得这时候爱丽丝的操作为取回弹珠,即她可以选择一种颜色的弹珠,并且直接取回,鲍勃的操作为选择一种颜色的弹珠,并且进行保留,使得爱丽丝无法取回这个颜色的弹珠。
那么当爱丽丝取回一次之后,就会使得当前的分数
S
i
2
=
S
i
+
(
a
i
+
b
i
−
1
)
S_{i2} = S_i + (a_i + b_i - 1)
Si2=Si+(ai+bi−1),因为她取回的时候会连带着鲍勃本身就有的取走(呼应本来的题目要求)。
这时候我们发现,如果我们选择
(
a
i
+
b
i
)
(a_i + b_i)
(ai+bi)更大的组合的话,就能够获得更多的收益。
这时候这个想法也可以呼应回原本的题目。
按照
(
a
i
+
b
i
)
(a_i + b_i)
(ai+bi)从大到小排序之后,两者都去选择更靠前的颜色i进行操作。
void solve(){
int n;cin >> n;
vector<pii>s(n+1);
for(int i = 1;i <= n;i++)cin >> s[i].first;
for(int i = 1;i <= n;i++)cin >> s[i].second;
sort(s.begin()+1,s.end(),[&](pii a,pii b){
return a.first + a.second > b.first + b.second;
});
long long ans = 0;
for(int i = 1;i <= n;i++){
if(i&1)ans += s[i].first - 1;
else ans -= s[i].second - 1;
}
cout << ans << endl;
}