Codeforces Round #759 (Div. 2, based on Technocup 2022 Elimination Round 3)AB题解

不知是一段时间没敲代码还是脑子不灵光了,做题的思路出的慢了。这期末的复习周,考完四级,还没做数据结构课设,忙里偷闲回顾一场cf上的比赛。

时间和水平原因,挑了Round #759 Div.2的AB两道题。

A. Life of a Flower

这个题的大意是:一花,两天不浇就无了,浇花长1cm,连续浇花长5cm,一开始1cm,最后多高?

我们看一下数据,更好的理解一下这个意思。
input:1 0 1 output:3
第一天长1cm,第三天长1cm,最后3cm。
input:0 1 1 output:7
第二天长1cm,第三天长5cm,最后7cm。
input:1 0 0 1 output:-1
第二天第三天没浇水,花没了,输出-1。
input:0 output:1
没浇水,还是原来的长度,最后1cm。

思路:模拟,判断条件。
如果是今天0,昨天0,花就没了。
如果今天1,昨天0,花长1cm。
如果今天1,昨天1,花长5cm。

再抽象一下,天数的数据用数组存起来。
a[0]单独判断一下。
然后从第二天开始到最后一天,
a[i]=0,a[i-1]=0,输出-1。
a[i]=1,a[i-1]=0,cnt++。
a[i]=1,a[i-1]=1,cnt+=5。

如此,代码:

#include<bits/stdc++.h>
using namespace std;
int a[110];
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		for(int i=0;i<n;i++)
		cin >> a[i];
		int cnt=1;//记录花的高度
		bool f=1;//标记花的死活
		if(a[0]==1)//处理第一天
		cnt++;
		for(int i=1;i<n;i++)//处理从第二天开始的情况
		{
			if(a[i]==0&&a[i-1]==0)//如果有两天没浇水,花就挂了
			{
				f=0;
				break;
			}
			if(a[i]==1&&a[i-1]==0)//一天浇水,花长1cm
			cnt++;
			if(a[i]==1&&a[i-1]==1)//连续浇水,花长5cm
			cnt+=5;
		}
		if(f)
		cout << cnt << endl;
		else
		cout << -1 << endl;
	}
	return 0;
}

B. Array Eversion

大致意思:一数组,比数组最后一元素大的放后面,比它小的放前面,几次变换,最后一个是最大值。

看测试数据:
第一组:
a = [2, 4, 1, 5, 3] 最后一个数是3,比3小的放前面,比3大的放后面,第一次变换:
a = [2, 1, 3, 4, 5]现在5作为最大的数,在数组的最后面了,也就是说,不能再变换了,故答案为1。

第二组:
a = [5, 3, 2, 4, 1]=>a = [1, 3, 2, 5, 4]=>a = [1, 3, 2, 4, 5],故答案为2。

这样看来有一种排序的思想,每次最后一个数都能排到自己的位置。

思路:每一次变换,距离最后一个数近的且比最后一个数大的数会成为最后一个数(有点绕了)。从后往前找每次比最后一个数大的数,一共有多少情况。(完了说不清楚了)。

长话短说,从最后面,碰到比最后一个数大的数,这个大数就成为最后一个数,计数+1,一直到最前面。(和原先差不多)

上代码吧:

#include<bits/stdc++.h>
using namespace std;
int a[200010];
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		for(int i=0;i<n;i++)
		cin >> a[i];
		int ans=0;
		int mx = a[n-1];//从最后开始
		for(int i=n-2;i>=0;i--)//往前找
		{
			if(a[i]>mx)
			{
				mx = a[i];
				ans++;
			}
		}
		cout << ans << endl;
	}
	return 0;
}

呜呜,奈何太菜,下次争取CD题解,梦想争取EF题解,哦不对,梦想直接A出CDEF。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三元湖有大锦鲤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值