B. K-Sort
一开始读题都没读明白,唉拖了好久。题意其实就是你搞一个k,然后可以选择顺序(无需连续,只需是先后的index即可)然后把这些下表的数全部加一。但是最后是支出k+1个代价,那么其实好解,每一个数字要加一,k都要多一,所以跟每个数字跟前一个数的差值相当,所以全部加起来就好了,然后就是k+1的+1的问题,这个+1也只用看落差最大的那个数就可以了,所以看看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1000000000;
typedef long long ll;
void solve(){
ll n;cin>>n;
vector<ll>a(n+1,0);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
ll ans=0,maxi=0,mini=0;
for(int i=1;i<=n;i++)
{
if(i==1)maxi=a[i];
if(i>1){
if(maxi>a[i])
{
ans+=maxi-a[i];
mini=max(mini,maxi-a[i]);
}
else maxi=a[i];
}
//ans+=mini;
}
ans+=mini;
cout<<ans<<endl;
}
int main(){
int T;cin >> T;
while(T--){
solve();
}
return 0;
}
C. Basil's Garden
这题风其实看作从右往左吹,然后从后往前遍历,如果后面一个比前面那个小,那就维持原来那个高度作为ans,如果反过来,那就是新的高度,但是,这里面就是每次移动的时候,如果是后小于前(前者)那每次都是要加一的,注释因为滞后性,要等前一个吹下去了才能再被吹。所以通式是ans=max(ans+1,a[i])
#include<bits/stdc++.h>
using namespace std;
const int N = 1000000000;
typedef long long ll;
void solve(){
int n;cin>>n;vector<int>a(n,0);
for(int i=0;i<n;i++)cin>>a[i];
int ans=a[n-1];
for(int i=n-2;i>=0;i--)
{
ans=max(ans+1,a[i]);
}
cout<<ans<<endl;
}
int main(){
int T;cin >> T;
while(T--){
solve();
}
return 0;
}