Codeforces Round #560 (Div. 3)

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;
}
posted @ 2019-05-26 09:16  gzgywh  阅读(115)  评论(0编辑  收藏  举报