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