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

浙公网安备 33010602011771号