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;
 
 }
 else if(y==m)
 {
 sum+=a[i];
 id[i]=1;
 
 }
 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;
 }
 
 |