A. Remainder
分析:暴力捞出后x位,然后看看后y位和它的差距
#include "bits/stdc++.h"
using namespace std;
int n;
int x,y;
int main()
{
string s;
scanf("%d%d%d",&n,&x,&y);
cin>>s;
int cnt=0;
string sx="";
for(int i=n-1;i>=n-x;i--){
sx+=s[i];
}
//cout<<sx<<endl;
for(int i=0;i<y;i++){
if(sx[i]!='0') cnt++;
}
if(sx[y]!='1') cnt++;
for(int i=y+1;i<x;i++){
if(sx[i]!='0') cnt++;
}
printf("%d\n",cnt);
return 0;
}
B. Polycarp Training
分析:看其中是否存在比i大的
#include "bits/stdc++.h"
using namespace std;
const int maxn=2e5+100;
int n,a[maxn];
int vis[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int i=1,j=1;
int cnt=0;
while(j<=n){
if(a[j]>=i){
cnt++;
i++,j++;
}else{
j++;
}
}
printf("%d\n",cnt);
return 0;
}
C. Good String
分析:看奇数位和它下一位是否相同,如果相同,就删除到不相同为止,最后注意一下奇偶
#include "bits/stdc++.h"
using namespace std;
const int maxn=2e5+100;
int n;
string s;
int vis[maxn];
int main()
{
cin>>n;
cin>>s;
int i=0;
while(i<n){
if(s[i]!=s[i+1]){
i+=2;
}else{
int j=i+1;
while(j<n&&s[j]==s[i]){
vis[j]=1;
j++;
}
i=j+1;
}
}
int cnt=0;
for(int i=0;i<n;i++){
if(vis[i]==1) cnt++;
}
int flag=0;
if((n-cnt)%2){
cnt++;
flag=1;
}
printf("%d\n",cnt);
string res="";
for(int i=0;i<n;i++){
if(vis[i]==0) res+=s[i];
}
if(flag){
for(int i=0;i<res.size()-1;i++) cout<<res[i];
cout<<endl;
}else cout<<res<<endl;
return 0;
}
D. Almost All Divisors
分析:把最大约数和最小约数乘起来,然后枚举这个数的所有约数,看是否满足条件
#include "bits/stdc++.h"
using namespace std;
const int maxn=2e5+100;
typedef long long LL;
int T;
LL d[maxn];
int main()
{
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&d[i]);
sort(d+1,d+n+1);
LL res=d[1]*d[n];
vector<LL>v;
for(LL i=2;i*i<=res;i++){
if(res%i==0){
if(i*i!=res){
v.push_back(i);
v.push_back(res/i);
}else{
v.push_back(i);
}
}
}
sort(v.begin(),v.end());
if(v.size()!=n){
cout<<"-1"<<endl;
}else{
int flag=0;
for(int i=1;i<=n;i++){
if(v[i-1]!=d[i]){
flag=1; break;
}
}
if(flag) cout<<"-1"<<endl;
else cout<<res<<endl;
}
}
return 0;
}
E. Two Arrays and Sum of Functions
分析:化简式子可知,每个\(a_i \times b_i\)只会在\(l \leq i\)的时候被枚举,同时每次被加的次数一定是\(n-i+1\),所以我们令\(val_i=i \times (n-i+1) \times a_i\),然后因为要最小化那个函数,所以一定要使得\(val_i \times b_i\)最小,所以用最大的\(val_i\)和最小的\(b_i\)组合即可
#include "bits/stdc++.h"
using namespace std;
const int maxn=2e5+100;
typedef long long LL;
const LL mod=998244353;
LL a[maxn],val[maxn],b[maxn];
int n;
bool cmp(const LL x,const LL y){
return x>y;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
val[i]=i*1ll*(n-i+1)*a[i];
}
sort(val+1,val+1+n,cmp);
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
sort(b+1,b+1+n);
LL sum=0;
for(int i=1;i<=n;i++){
LL tmp=((val[i]%mod)*(b[i]%mod))%mod;
sum+=tmp;
sum%=mod;
}
printf("%lld\n",sum);
return 0;
}
Codeforces Round #560 (Div. 3)
原文:https://www.cnblogs.com/gzgywh/p/10925082.html