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; }
|