zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/Herlo/p/13205839.html
Copyright © 2011-2022 走看看