ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #653 (Div. 3)(A 二分 B 水 C 水 D 水 E1 思维 F 模拟 得到有序数组 )

2020-06-30 10:37:04  阅读:241  来源: 互联网

标签:int ll Codeforces read while 653 Div id define


题目链接

A. Required Remainder

题意:给你 x、y、n 求最大的k (k<=n) 使得k%x==y  

做法:二分x的倍数即可,水

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=1e2+10;
char s[N];
int len;
int main()
{
    int _=read();while(_--)
    {
        ll x=read(),y=read(),n=read();

        ll l=0,r=1e9+10,ans=0;
        while(l<=r)
        {
            ll mid=l+r>>1;
            if(mid*x+y<=n) l=mid+1,ans=mid*x+y;
            else r=mid-1;
        }
        printf("%lld\n",ans);

    }
}

B. Multiply by 2, divide by 6

题意:给你一个数n 每次两个操作:乘2   除6  求最少的操作 得到1

做法:唯一分解2素数得次幂 和3 的次幂  有其他素数 -1

2的次幂大于3的次幂 -1

答案3的次幂减去2的次幂加上3的次幂

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=1e2+10;
char s[N];
int len;
int main()
{
    int _=read();while(_--)
    {
        ll n=read();
        if(n==1){
            puts("0");continue;
        }
        int num2=0,num3=0;
        while(n%2==0) num2++,n=n/2;
        while(n%3==0) num3++,n=n/3;
        if(n!=1||num2>num3){
            puts("-1");continue;
        }

        int ans=num3-num2+num3;
        printf("%d\n",ans);

    }
}

 

C. Move Brackets

题意:给你只包含'(' ')' 的字符串,每次操作可以选择一个字符 要么移到最后面  要么移到最前面,求最少的操作使得字符串是括号匹配的字符串

做法:判断不能匹配的’('  以及 ')' 的个数,两者取最小值即可。

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=1e2+10;
char s[N];
int len;
int main()
{
    int _=read();while(_--)
    {
        len=read();
        scanf("%s",s+1);
        stack<char>sta;
        int l=0,r=0;
        for(int i=1;i<=len;++i){
            if(s[i]=='(') sta.push('(');
            else{
                if(sta.size()) sta.pop();
                else r++;
            }
        }
        l=sta.size();
        int ans=min(l,r);
        printf("%d\n",ans);
    }
}

D. Zero Remainder Array

题意:给你n长度的整数数组 a  ,一个x  每次操作可以选择一个 下标i  让a[i]+=x  然后x自增1   操作2是 不选择下标  单独的x自增1

做法:a[i]对k取模 得到离k(k-a[i]%k)的距离,统计离k距离相同数量最多的,num 和  mx  答案就是 (num-1)*k+mx+1;

  

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=2e5+10;
int n,k;
int a[N];
int main()
{
    int _=read();while(_--)
    {
        n=read(),k=read();
        map<int,int>mp;
        int mx=0,num=0;
        rep(i,1,n) {
            a[i]=read();
            int d=k-a[i]%k;
            if(d==k) continue;
            mp[d]++;
            if(mp[d]>num) mx=d,num=mp[d];
            else if(mp[d]==num) mx=max(mx,d);
        }
        if(num==0){
            puts("0");continue;
        }
        //printf("num:%d mx:%d\n",num,mx);
        ll ans=(1ll*num-1)*k+mx+1;
        printf("%lld\n",ans);
    }
}

 

E1. Reading Books (easy version)

题意:给n本书,以及一个K  每本书 可能是 (Alice 喜欢  Bob  不喜欢)(Alice 不喜欢  Bob  喜欢)(Alice 不喜欢  Bob  不喜欢) 每本书有一个阅读时间t[i]  每次只能选择一本书进行阅读。现在要求ALICE 和Bob  都至少读k本自己喜欢的书,并且时间消耗最少。

做法:

三种情况分开保存,(Alice 喜欢  Bob  不喜欢)a数组,   (Alice 不喜欢  Bob  喜欢)b数组,(Alice 不喜欢  Bob  不喜欢)c数组

对a数组 b数组分别选前k个,不足k个从c里面选。都满k个后 再从c里面选共同的  同时去掉 a里面、b里面得到  的两个最大值。

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=2e5+10;
int vis[N],n,k,l1,l2,l3,val[N];
struct node
{
    int v,id;
}a[N],b[N],c[N];
bool cmp(node a,node b)
{
    return a.v<b.v;
}
deque<node>ans1,ans2;
int main()
{
    n=read(),k=read();
    rep(i,1,n)
    {
        int x=read(),t1=read(),t2=read();
        if(t1==1&&t2==1) c[++l3]={x,i};
        else if(t1==1) a[++l1]={x,i};
        else if(t2==1) b[++l2]={x,i};
        val[i]=x;
    }


    if(l1+l3<k||l2+l3<k){puts("-1");return 0;}


    sort(a+1,a+1+l1,cmp);
    sort(b+1,b+1+l2,cmp);
    sort(c+1,c+1+l3,cmp);

    //printf("l3:%d\n",l3);


    for(int i=1;i<=k&&i<=l1;++i) ans1.push_back(a[i]);
    for(int i=1;i<=k&&i<=l2;++i) ans2.push_back(b[i]);

    int now=1;
    while(now<=l3&&(ans1.size()<k||ans2.size()<k)){

        //printf("now:%d\n",now);
        if(ans1.size()<k&&ans2.size()<k){
            ans1.push_front(c[now]);
            ans2.push_front(c[now]);
        }
        else if(ans1.size()<k){


            ans1.push_front(c[now]);
            ans2.push_front(c[now]);
            ans2.pop_back();
        }
        else{
            ans1.push_front(c[now]);
            ans2.push_front(c[now]);
            ans1.pop_back();
        }
        now++;
    }

    while(now<=l3){
        if(c[now].v<=ans1.back().v+ans2.back().v){
            ans1.push_front(c[now]);
            ans2.push_front(c[now]);
            ans1.pop_back();
            ans2.pop_back();
        }
        ++now;
    }

    for(auto it:ans1) vis[it.id]=1;
    for(auto it:ans2) vis[it.id]=1;

    ll ans=0;
    rep(i,1,n) if(vis[i]) ans+=val[i];
    printf("%lld\n",ans);

}

F. Cyclic Shifts Sorting

题意:给你n长度 整数数组 a[i]  每次选择一个下标i  然后对(i,i+1,i+2)进行向右移动  i+2移到i。问最少的操作使得这个数组是递增的数组,如果不能得到则输出-1

做法:

复杂模拟,每次找到最小的那个值,然后不断的反转 移到前面去,进行n-2轮后 得到两种情况:

第一种:1 2 3 4 5  有序

第二种:1 2 3 5 4  无序。

对于第二种则需要将 5 4 的位置倒一下 选择n-2下标:

1 2 4 3 5

接着对 4 3 倒一下:

1 3 2 4 5

此时发现  只有前面出现两个相同的时候才可以得到有序的数组。

例如:

1 2 3 3 5 4 => 1 2 3 4 3 5 => 1 2 3 3 4 5 

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline ll read()
{
	ll x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}
const int N=5e2+10;

int n;
int a[N],vis[N];
int main()
{
    int _=read();while(_--)
    {
        n=read();
        rep(i,1,n) a[i]=read();
        int base=1;
        vector<int>ans;
        for(int k=1;k<n-1;++k){
            int mi=INT_MAX,id=0;
            for(int i=base;i<=n;++i){
                if(a[i]<mi) mi=a[i],id=i;
            }
            //printf("mi:%d id:%d\n",mi,id);
            while(id>=base+2){
                ans.push_back(id-2);
                int tmp=a[id];
                a[id]=a[id-1];
                a[id-1]=a[id-2];
                a[id-2]=tmp;
                id=id-2;
            }
            if(id==base+1){
                ans.push_back(base);
                ans.push_back(base);
                int tmp=a[id];
                a[id]=a[id+1];
                a[id+1]=a[base];
                a[base]=tmp;
            }
            base++;
        }
        //rep(i,1,n) printf("%d ",a[i]);
        //puts("");
        int flag=1;
        for(int i=1;i+1<=n;++i) if(a[i+1]<a[i]) flag=0;

        if(flag){
            printf("%d\n",ans.size());
            for(int v:ans) printf("%d ",v);
            puts("");
        }
        else{
            int f=0,mx=0;

            rep(i,1,n) mx=max(mx,a[i]);
            rep(i,0,mx) vis[i]=0;
            rep(i,1,n) vis[a[i]]++;
            rep(i,1,n) if(vis[a[i]]>=2) f=1;

            if(f){
                //puts("***");
                int id=n;
                while(id-1>=1&&a[id]<a[id-1]){
                    ans.push_back(id-2);
                    int tmp=a[id];
                    a[id]=a[id-1];
                    a[id-1]=a[id-2];
                    a[id-2]=tmp;
                    id--;
                }
                printf("%d\n",ans.size());
                for(int v:ans) printf("%d ",v);
                puts("");

            }
            else puts("-1");


        }

    }
}
/*
5
8
1 2 3 3 4 5 7 6
*/

 

标签:int,ll,Codeforces,read,while,653,Div,id,define
来源: https://blog.csdn.net/qq_41286356/article/details/107020023

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有