Hello 2024
A-Wallet Exchange
博弈论?找规律
每一回合当前共有金币减少1,那么最后一个金币的轮次者获胜。因为下一回合,金币为0,无法操作。
由于Alice先手,包括第一轮,当轮次为偶数时,Alice操作
所以只要金币是偶数个,那么Alice操作后必然变为0个。即Alice获胜,反之Bob获胜
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
void slove() {
int t;
cin >> t;
while (t--) {
ll a, b;
cin >> a >> b;
ll sum = a + b;
if (sum & 1)cout << "Alice" << endl;
else cout << "Bob" << endl;
}
}
int main() {
slove();
}
B-Plus-Minus Split
贪心策略,找规律?
字符串s中,负号代表-1,正号代表1,而罚金p(b) = 元素之和的绝对值*区间长度
可以得出,如果元素之和的绝对值>=1 的时候,若长度大于1,其罚金必然比 单独元素交的罚金多。
意思是,如果整个区间之和不为0,那么我们将剩下的所有元素划分为单个区间最划算。
如果负号少,正号多,那么一定能有一个或多个区间将正负号抵消,那么剩下来的正号单独划分即可。答案就是剩下的正号数量。
如果负号多,正号少,也一样。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
void slove() {
int t;
cin >> t;
while (t--) {
int n;
cin>>n;
string s;
cin>>s;
ll z=0,f=0;
for(auto i:s){
if(i=='-')f++;
else z++;
}
cout<<abs(z-f)<<endl;
}
}
int main() {
slove();
}
C-Grouping Increases
贪心
wa了很多次,先讲讲错了的思路,然后可以更好的过度到正确的思路。
首先,罚金只于一个数后面的数有关。所以我们只需要关注一个区间动态的末尾数就行了,因为前面的部分已经计算了。
将序列a分成两个区间 t1,t2
由于区间内元素只需要相对位置符合序列a就行。
所以a[0] 必然是t1/t2的第一个元素。
假设a[0]必然是t1的第一个元素
那么t2的第一个元素是谁?
假设为a[1] (错误的根本原因)
为了方便,令x、y为t1,t2末尾元素,且时刻保证(x>y)
现在开始将后续的元素插入区间:
如果a[2] > x > y
那么a[2]应该放在哪里?
首先,不管放在哪里,已经产生一个罚金。
接下来我们需要将a[2]的长度优势利用干净
将a[2]放在t2后面更优,因为t2的原本短的结尾更长了,能挡住更多的元素。
而t1的结尾本来就长于t2,所以放t2后面更优秀一些。
如果 x>a[2]>y 怎么办?
放在y后面会产生罚金,这是不能接受的,所以我们放在x后面。
如果x>y>a[2]
此时需要放在y后面,因为如果放在x后面,x本来很长的板子就缩短了,不利于后续的操作。
所有情况就讲完了,但是有一个错误点,就是,不一定a[2]作为一个区间的开头更优秀。
所以,我们干脆令 初始值无穷大,这样就不需要考虑起始位置了。
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
void slove() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> v(n);
bool is_yes = 0;
for (auto& i : v)cin >> i;
int tall,small;
tall=1e9;
small=1e9;
ll ans=0;
for(int i=0;i<n;i++){
if(tall<small)swap(tall,small);
if(v[i]<=small){
small=v[i];
}
else if(v[i]<=tall){
tall=v[i];
}
else {
ans++;
small=v[i];
}
}
cout<<ans<<endl;
}
}
int main() {
slove();
}
{
tall=v[i];
}
else {
ans++;
small=v[i];
}
}
cout<<ans<<endl;
}
}
int main() {
slove();
}