b题
只需要把递增的地方累加起来,最后加上最大值减去最后一点的值即可
ac代码
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
int ans=0;
int Max=0;
a[0]=1e13+1000;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
if(a[i]>a[i-1]) ans+=a[i]-a[i-1];
Max=max(Max,a[i]);
}
if(a[n]!=Max) ans+=Max-a[n];
printf("%d
",ans);
}
}
k题
去掉m个字母保持字典序最小
在m未耗尽之前保持双端队列内的字母为递增
最后若m若有剩余 队列内的字母一定是非递减的 只需去掉后m个即可
#include<cstdio>
#include<algorithm>
#include<queue>
#include<string>
#include<iostream>
#include<list>
#include<stack>
#include<deque>
using namespace std;
char tmp[100005];
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
deque<char>s;
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",tmp+1);
for(int i=1; i<=n; i++)
{
while(s.size()&&s.back()>tmp[i]&&m>0) s.pop_back(),m--;
s.push_back(tmp[i]);
}
//cout<<m<<endl;
while(s.size()>m) printf("%c",s.front()),s.pop_front();
printf("
");
if(!s.empty()) s.pop_front();
}
}