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