A. Wizard of Orz
傳送門
題意:n個整數,開始全是0,每一秒全部+1模10,可以在任意的位置,讓序列暫停。它的相鄰位過1秒鐘暫停,相隔爲2的位置過2秒鐘暫停,問操作後得到的最大的數是多少?
思路:最大第一位必須是9,所以第二位是8,第二位暫停後第一位和第三位都是9,剩下n-3個數從0開始加並模10。
AC代碼:
#include<bits/stdc++.h>
using namespace std;
int n,m;
void solve()
{
cin>>n;
if(n==1) cout<<9<<endl;
else if(n==2) cout<<98<<endl;
else if(n==3) cout<<989<<endl;
else
{
cout<<989;
for(int i=1;i<=n-3;i++)
cout<<(i-1)%10;
cout<<endl;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
B. Hills And Valleys
題意:長度爲n的序列,如果 a [ i ] > a [ i + 1 ] & & a [ i ] > a [ i − 1 ] a[i]>a[i+1]\&\& a[i]>a[i-1] a[i]>a[i+1]&&a[i]>a[i−1]爲波峯,如果 a [ i ] < a [ i + 1 ] & & a [ i ] < a [ i − 1 ] a[i]<a[i+1]\&\& a[i]<a[i-1] a[i]<a[i+1]&&a[i]<a[i−1]爲波谷,可以把一個數變成任意值,問操作後波峯波谷最小值爲多少?
思路:分析得出,要改變 a [ i ] a[i] a[i]減少波峯波谷,就改成 a [ i − 1 ] a[i-1] a[i−1]或者 a [ i + 1 ] a[i+1] a[i+1],但可能產生新的波峯波谷,所以我們枚舉每一個波峯波谷的兩週情況,取減少的最大值,用原來波峯波谷的和減去最大值。
AC代碼:
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
#define per(i,a,b) for (int i=(a);i>=(b);i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
ll gcd(ll a,ll b) {
return b?gcd(b,a%b):a;}
const int N=3e5+10;
int n;
int a[N];
bool check(int x)
{
if(x<=1||x>=n) return 0;
if(a[x]>a[x-1]&&a[x]>a[x+1]) return 1;
if(a[x]<a[x-1]&&a[x]<a[x+1]) return 1;
return 0;
}
void solve()
{
cin>>n;
int sum=0;
rep(i,1,n) cin>>a[i];
rep(i,1,n) sum+=check(i);
int maxv=0;
rep(i,2,n-1)
{
int k=check(i-1)+check(i)+check(i+1);
int tmp=a[i];
a[i]=a[i-1];
int p=check(i-1)+check(i)+check(i+1);
maxv=max(maxv,k-p);
a[i]=a[i+1];
p=check(i-1)+check(i)+check(i+1);
maxv=max(maxv,k-p);
a[i]=tmp;
}
cout<<sum-maxv<<endl;
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int t;
cin>>t;
while(t--) solve();
return 0;
}