Educational Codeforces Round 121 (Rated for Div. 2)题解

A. Equidistant Letters

题意:给你一个字符串s,其中每个字符最多出现两次,将s重新排列,使得其中任意两个相同的字符的距离相同,输出任意一个答案

思路:将字符串s排序即可

#include<bits/stdc++.h>

using namespace std;

void solve(){
	string s; cin>>s;
	sort(s.begin(),s.end());
	cout<<s<<endl;
}

int main()
{
	int tt; cin>>tt;
	while(tt--) solve();



	return 0;
}

B. Minor Reduction

题意:给定一个没有前导0的整数,选择其中两个相邻的位置,合并这两个为并替换为和,问得到的最大数字是多少

思路:贪心,如果存在进位的,那么肯定选择进位的两个数,并且这两个数位于最末尾。如果不存在进位 如果存在两个都非0,取最靠前的一个,如果不是前两种情况,那么肯定取末尾两个

#include<bits/stdc++.h>

using namespace std;

void solve(){
	string s; cin>>s;
	for(int i=s.size()-2;i>=0;--i){
		if(s[i]-'0'+s[i+1]-'0'>=10){
			long long res=s[i]-'0'+s[i+1]-'0';
			s[i]=res/10+'0';
			s[i+1]=res%10+'0';
			cout<<s<<endl;
			return ;
		}
	}
	cout<<s[0]-'0'+s[1]-'0';
	for(int i=2;i<s.size();++i) cout<<s[i];
	cout<<endl; return ;
}

int main()
{
	int tt; cin>>tt;
	while(tt--) solve();



	return 0;
}

C. Monsters And Spells

题意:Monocarp进行一个打怪游戏,游戏一共有n个怪物,第i个怪物在ki秒出现,血量为hi。每一秒,Monocarp可以施一次法术,如果上一秒钟没有施法,则当前秒造成的伤害为1。否则假设上一秒施法造成的伤害为x,则当前可以选择伤害1或者x+1。要消灭怪物i,需要在ki秒时,造成的伤害大于等于hi。然而每次造成x点伤害需要消耗x点能量。问最少需要消耗多少能量才能消灭所有怪物。

思路: 贪心,考虑是否和前一个合并为同一个连续施法段

每个怪物,可以得到,要消灭它,至少要从k[i]-h[i]+1秒或者开始到k[i]秒都施法,才能消灭怪物,记这个开始时间为start[i],如果start[i+1]>k[i],则i+1以后的不应该和前面的合并,否则一定要合并

#include<bits/stdc++.h>

using namespace std;

void solve(){
	int n; cin>>n;
	long long k[n+1],h[n+1],ans=0;
	map<int,int> mp;
	for(int i=1;i<=n;++i) cin>>k[i];
	for(int i=1;i<=n;++i){
		cin>>h[i];
		mp[k[i]-h[i]+1]++;
		mp[k[i]]--;
	}
	long long last=0,now=0;
	for(auto [time,val] : mp){
		if(now==0&&val>=0) last=time;
		now+=val;
		if(now==0) ans+=(1+time-last+1)*(time-last+1)/2;
	}
	cout<<ans<<endl;
}

int main()
{
	int tt; cin>>tt;
	while(tt--) solve();



	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

只微

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

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

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

打赏作者

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

抵扣说明:

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

余额充值