Codeforces Round #695 (Div. 2)

A.Wizard of Orz

题意:给你个数n,输出n位,求操作一次后的所能得到的最大值。
操作是选择一个位置i,然后与其相邻的位置会和他相差1. 以此类推。
思路:尽量使得首位为9,所以选择第二位为8,则是最优的,输出9890123456789…

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s1="0123456789";
	int i,j,n,t;
	cin>>t;
	while(t--){
		cin>>n;
		if(n>=3){
			cout<<"989";
			n-=3;
		}
		else {
			if(n==1){
				cout<<9<<endl;
				continue;
			}
			else if(n==2) {
				cout<<98<<endl;
				continue;
			}
			else if(n==3){
				cout<<989<<endl;
				continue;
			}
			n-=3;
		}
		for(i=0;i<n;i++){
			cout<<s1[i%10];
		}
		cout<<endl;
	}
}

B. Hills And Valleys

题意:能更改一个位置的数,求更改完之后山峰和山谷的和最小
思路:因为更改一个数只会影响到相邻的,并且最优的情况是将那个数更改为和左边相等或者和右边相等两种方案,所以枚举一下所有的下标,每个下标可以有两种可能的更改,再与原方案做对比。

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+100;
int a[maxn];
int judge(int i,int n){
	if(i+1==n||i==0){
		return 0;
	}
	if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i+1]&&a[i]<a[i-1])){
		return 1;
	}
	else 
		return 0;
}
int main()
{
	int n,i,j,t;
	cin>>t;
	while(t--){
		cin>>n;
		for(i=0;i<n;i++){
			cin>>a[i];
		}
		int ans=0;
		for(i=1;i<n-1;i++){  
			if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i+1]&&a[i]<a[i-1])){
				ans++;
			}
		}
		int cnt=0,ans1=0;
		for(i=1;i<n-1;i++){
			int m1=a[i-1],m2=a[i],m3=a[i+1];
			int a1=judge(i,n),b1=judge(i-1,n),c1=judge(i+1,n);
			int sum1=a1+b1+c1;
			a[i]=m1;
			cnt=(judge(i,n)+judge(i-1,n)+judge(i+1,n));
			ans1=max(sum1-cnt,ans1);
			cnt=0;
			a[i]=m3;
			cnt=(judge(i,n)+judge(i-1,n)+judge(i+1,n));
			ans1=max(sum1-cnt,ans1);
			cnt=0;
			a[i]=m2;	
		}
		cout<<ans-ans1<<endl;
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值