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;
}

猜你喜欢

转载自www.cnblogs.com/Herlo/p/13205839.html