Edu166

A

思路

直接按照题意模拟即可,可以使用sort解决问题。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
int n; cin>>n;
string s; cin>>s;
for(int i=0;i<n-1;i++)
{
if(s[i]-'a'>=0 && s[i]-'a'<26 && s[i]-'0'>=0 && s[i]-'0'<=9)
{
cout<<"nO\n";
return;
}

}
string t=s;
sort(s.begin(),s.end());
if(s!=t) cout<<"NO\n";
else cout<<"Yes\n";
}
int main()
{
int t=1;
cin>>t;
while(t--) solve();
return 0;
}

B

思路

不难想到,如果是在操作中间可以得到的,我们直接在中途中拼接到尾部即可。否则只能循环取遍最小值,再更新答案。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
int n; cin>>n;
std::vector<ll> a(n),b(n+1);
for (int i = 0; i < n; ++i)
{
cin>>a[i];
}
for (int i = 0; i < n+1; ++i)
{
cin>>b[i];
}
ll ans=1;
bool add=false;
for(int i=0;i<n;i++)
{
ans+=abs(a[i]-b[i]);
if(max(a[i],b[i])>=b[n] && min(a[i],b[i])<=b[n]) add=true;
}
if(!add)
{
ll minn=1e12;
for (int i = 0; i < n; ++i)
{
minn=min({minn,abs(a[i]-b[n]),abs(b[i]-b[n])});
}
ans+=minn;
}
cout<<ans<<"\n";
}
int main()
{
int t=1;
cin>>t;
while(t--) solve();
return 0;
}

C

思路

可以先从特别的情况出发,不选最后一个人。

然后再进行推导,我们从后往前推,如果不选第i个人,那么就会留出来一个空职位。

这个空职位可以这样分配:找到原来应该分配到理想职位,但是没有被分配到的。

可以这样不断的类推下去,所以不难想到是dp

我们可以先计算特别情况的贡献,然后dp没有选择第i个人可以多得到的贡献。

不难得到状态转移方程:\(dp[i]=dp[x]+a[x]-b[x]\)或者\(dp[i]=dp[x]+b[x]-a[x]\)

\(x\)就是上面没有分配到理想职位的人,注意dp后需要更新\(x\)

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
void solve()
{
int n,m; cin>>n>>m;
int N=m+n+1;
std::vector<ll> a(N,0),b(N,0);
std::vector<int> id(N,0);
for (int i = 0; i < N; ++i)
{
cin>>a[i];
}
for (int i = 0; i < N; ++i)
{
cin>>b[i];
}
int x=0,y=0;
ll sum=0;
for (int i = 0; i < N-1; ++i)
{
if(x==n)
{
sum+=b[i];
id[i]=0;
//y++;
}
else if(y==m)
{
sum+=a[i];
id[i]=1;
//x++;
}
else if(a[i]>b[i])
{
sum+=a[i];
id[i]=1;
x++;
}
else
{
sum+=b[i];
id[i]=0;
y++;
}
}
x=N-1,y=N-1;
std::vector<ll> dp(N,0);
dp[N-1]=0;
for (int i = N-2; i >=0 ; i--)
{
if(x==N-1 && id[i])
{
dp[i]=dp[x]+a[x];
}
else if(y==N-1 && id[i]==0)
{
dp[i]=dp[y]+b[y];
}
else if(id[i])
{
dp[i]=dp[x]+a[x]-b[x];
}
else
{
dp[i]=dp[y]+b[y]-a[y];
}

if(id[i] && b[i]>a[i])
{
y=i;
}
else if(id[i]==0 && a[i]>b[i])
{
x=i;
}
}
for (int i = 0; i < N-1; ++i)
{
cout<<sum-(id[i]?a[i]:b[i])+dp[i]<<" ";
}
cout<<sum<<"\n";
}
int main()
{
int t=1;
cin>>t;
while(t--) solve();
return 0;
}