2021.01.30 Rating赛补题报告

A - A

 题意:一共有n个人,通过考试的会去餐厅庆祝。去BugDonalds的有a个人,去BeaverKing的有b个人,两者都去的有c人。没通过考试在家复习的至少有一个人。判断数据是否准确。

 题解:a∩b=c,如果数据准确,则a>=c,b>=c,c<=n,未通过考试的人为n-aUb=n-a-b+c>=1(aUb=a+b-ab=a+b-c);反之数据错误。如果数据准确输出未通过考试的人数,数据错误输出-1.

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
using namespace std;
int main(){
    int a,b,c,n;
    int cnt=0;
    cin>>a>>b>>c>>n;
    cnt=n-a-b+c;
    if(cnt<1){
        cout<<-1<<endl;
    }else if(a<c||b<c||c>n){
        cout<<-1<<endl;
    }else{
        cout<<cnt<<endl;
    }
    return 0;
}
View Code

B - B

题意:n个数 ai (2<=ai<=5),可以将任意一个不为5的数改为5,求最少改动几个数,可以使得平均值为5

题解:从最小的数开始改

#include <bits/stdc++.h>
using namespace std;
#define MAXN 110
int a[MAXN];
int main(){
    int n;
    double sum=0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    sort(a,a+n);
    int cnt=0;
    if(sum/(n*1.0)>=4.5){
        cout<<0<<endl;
        return 0;
    }
    for(int i=0;i<n;i++){
        sum+=(5-a[i]);
        cnt++;
        if(sum/(n*1.0)>=4.5){
            break;
        }
    }
    cout<<cnt<<endl;
    return 0;
} 
View Code

C - C

 题意:一个箱子里有n个糖果,Vasya每天早上吃掉k块糖果,如果不足k个就全部吃掉,晚上Petya吃掉糖果的10%(向下取整),求最小的k使Vasva至少吃掉一半糖果

题解:数据太大,用二分来依次判断,取最小的mid

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll check(ll k){
    ll sum=0,t;
    t=n;
    while(t){
        if(t>k){
            sum+=k;
            t-=k;
        }else{
            sum+=t;
            t=0;
        }
        t-=(t/10);
    }
    return sum;
}
int main(){
    
    cin>>n;
    ll first,last,mid,end=n;
    first=1,last=n;
    while(first<=last){
        mid=(first+last)/2;
        if(check(mid)>=(n+1)/2){
            last=mid-1;
            end=min(mid,end);
        }else{
            first=mid+1;
        }
    }
    cout<<end<<endl;
    return 0;
} 
View Code

 

posted @ 2021-02-05 19:34  Endeavo_r  阅读(60)  评论(0)    收藏  举报