Hello 2024

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();
}


  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

louisdlee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值