• Codeforces Round #653 (Div. 3) B ~ E1题解


    B. Multiply by 2, divide by 6

    题意

    给你一个数字n,操作有两种

    • n*=2
    • n/=6(只有当n整除6的时候才可以进行此操作)
      问你最少多少次操作,可以把n变为1,如果不可能输出n

    思路

    从质因子分解角度分析:
    操作一:增加质因子2
    操作二:减少质因子2,3
    所以如果n可以经过操作变为1,则n最多只有两种质因子:2,3。并且因为操作无法增加质因子3,n中质因子3的个数一定大于质因子2的数目,然后就贪)

    代码

    #define int ll
    void solve()
    {
        int n;cin>>n;
        int a=0,b=0;
        while(n%3==0)  ++a,n/=3;
        while(n%2==0)  ++b,n/=2;
        if(b>a||n!=1) cout<<-1<<endl;
        else cout<<b+(a-b)*2<<endl;
    }
    

    C - Move Brackets

    这个题完全是对着样例编程,老括号配对了,没啥好说的qwq

    void solve()
    {
        int n;cin>>n;
        string s;cin>>s;
        stack<int>st;
        for(auto c:s)
        {
            int tmp = c=='('?1:0;
            if(st.size()&&st.top()==1&&tmp==0) st.pop();
            else st.push(tmp);
        }
        cout<<st.size()/2<<endl;
    }
    

    D - Zero Remainder Array

    题意

    为了使a数组中的元素模k全部等于0,可以从1~x中选择唯一 一个数 t 使a[ i ] += t(1 ~ x中每个数只能用一次),求最小的x

    思路

    纯模拟,map挺好用的

    代码

    #define int ll
    int a[MX];
    void solve()
    {
        int n,k;cin>>n>>k;
        map<int,int>mp;
        int ans=0;
        rpp(i,n) 
        {
            cin>>a[i];
            if(a[i]%k==0) continue;
            int tmp = k - a[i]%k;
            ans=max(ans,tmp+mp[tmp]*k+1);
            ++mp[tmp];
        }
        cout<<ans<<endl;
     
    }
    

    E1 - Reading Books (easy version)

    题意

    有n 种书,每本书有一个阅读时间,还有两个人小明和小红,小明和小红对每本书有喜欢和不喜欢两种情况,问你挑出来一组书,满足里面至少k 本书小明喜欢,k本书小红喜欢,问你总的最短阅读时间

    思路

    将书分为 1 1 ,0 1 ,1 0 三类,排序后枚举第一种书选了多少,直接计算即可

    代码

    vector写的所以长了点。

    #define int ll
    void solve()
    {
        int n,k;cin>>n>>k;
        vector<int>a,b,c;
        rpp(i,n) 
        {
            int t,x,y;cin>>t>>x>>y;
            if(x==1&&y==1)a.push_back(t);
            else if(x==1&&y==0) b.push_back(t);
            else if(x==0&&y==1) c.push_back(t);
        }
        sort(all(a)),sort(all(b)),sort(all(c));
        rep(i,b.size()) 
        {
            if(i==0) continue;
            b[i]+=b[i-1];
        }
        rep(i,c.size()) 
        {
            if(i==0) continue;
            c[i]+=c[i-1];
        }
        int pre=0,ans=-1;
        if((int)b.size()>=k&&(int)c.size()>=k) ans = b[k-1]+c[k-1];
        rep(i,a.size())
        {
            pre+=a[i];
            int nb = k-i-1,nc = k-i-1;
            if(nb<=(int)b.size()&&nc<=(int)c.size()) 
            {
                int tmp = pre;
                if(nb>=1) tmp+= b[nb-1];
                if(nc>=1) tmp+= c[nc-1];
                if(ans==-1) ans=tmp;
                else ans=min(ans,tmp);
            }
        }
        cout<<ans<<endl;
    }
    
  • 相关阅读:
    QWrap简介之:EventW Event包装
    QWrap简介之:core_retouch 渲染原生类
    QWrap简介之:youa_retouch 项目个性
    QWrap简介之:Apps 应用 收获果实
    QWrap简介之:Wrap模式
    QWrap简介之:dom_retouch NodeW 勇士装甲
    Activity之间的数据传递
    OpenGL ES Tutorial for Android
    从零开始学习OpenGL ES之一 – 基本概念
    java自定义注解
  • 原文地址:https://www.cnblogs.com/Herlo/p/13205839.html
Copyright © 2020-2023  润新知