AtCoder Beginner Contest 174
A - Air Conditioner
签到题,判断与30的关系(略)。
B - Distance
签到题,判断$n$个点到原点的距离和$d$的大小关系(略)。
D - Alter Altar
题意:
给你一个只含有$W$和$R$的串,每次可以交换任意两个$W$和$R$的位置或者把$W$变成$R$,问最少多少次可以使得所有的$R$左侧没有$W$。
分析:
当时想复zha了,首先最终的情况肯定是左边全是$R$,右边全是$W$。先看总共有有多少个$R$,计为$num_1$,这样就可以保证前$num_1$个全为$R$,然后在此之后的所有的$R$都必须与前面的$W$交换或者换成$W$,所以有多少个就是答案。(赛后过题真的烦)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=2e5+1000;
ll t,q,n;
int main(){
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
string a;
cin>>a;
ll num1=0,num2=0;
for(int i=0;i<n;i++){
if(a[i]=='R') num1++;
}
for(int i=num1;i<n;i++){
if(a[i]=='R') num2++;
}cout<<num2<<endl;
return 0;
}
E - Logs
题意:
给出$n$个木棍,问执行$k$次切割以后最长的长度的最小值是多少。
分析:
我一眼看出你是二分,大威天龙。二分答案,然后每次判断切出来的个数就完了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=2e5+1000;
ll t,k,n,a[maxn];
bool yes(ll mid){
ll cnt=0;
for(int i=0;i<n;i++){
if(a[i]>=mid){
cnt+=ceil(1.0*a[i]/mid)-1;
}
}
if(cnt<=k) return 0;
else return 1;
}
int main(){
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>k;
ll maxi=-1;
for(int i=0;i<n;i++){
cin>>a[i];
maxi=max(maxi,a[i]);
}
ll r=1e9+10,l=1;
while(l<=r){
ll mid=(r+l)>>1;
if(yes(mid)){
l=mid+1;
}else r=mid-1;
}cout<<l<<endl;
return 0;
}