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