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

原文地址:https://www.cnblogs.com/Zabreture/p/13423526.html