文章目录
传送门
A - If at first you don’t succeed… CodeForces - 991A
容斥原理
但小心数据,因为题目中a、b、c、n的大小不一定
#include<bits/stdc++.h>
using namespace std;
int a,b,c,n;
int main(){
scanf("%d%d%d%d",&a,&b,&c,&n);
if(c>a||c>b){
cout<<"-1"<<endl;
return 0;
}
if(a>n||b>n||c>n){
cout<<"-1"<<endl;
return 0;
}
if(n-a-b+c>=1){
printf("%d\n",n-a-b+c);
}
else{
cout<<"-1"<<endl;
}
return 0;
}
B - Getting an A CodeForces - 991B
这道题跟以前有一道题的做法类似。每次都排一下序,找到最小并更改最小的
把平均值设置为double,判断是否大于等于4.5
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
int n,a[maxn],num;
double sum;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
sum=(double)sum/n;
if(sum>=4.5){
cout<<"0"<<endl;
return 0;
}
while(1){
sort(a+1,a+1+n);
sum=0;num++;a[1]=5;
for(int i=1;i<=n;i++)
sum+=a[i];
if(sum/n>=4.5){
cout<<num<<endl;
return 0;
}
}
}
C - Candies CodeForces - 991C
这题题意是非常好理解的Vasya每次吃固定的糖数k,Petya每次吃剩下糖的10%,输出最小的k
第一: 如果模拟的话会超时(第一个代码),所以我们可以用二分O(nlogn)
第二:我们要注意题目中说的Vasya至少吃n的一半,我们得考虑n的奇偶
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,cnt;
ll num;
ll sum;
int main(){
// printf("%d\n",58/10);
scanf("%lld",&n);
for(ll k=1;k<=n;k++){
ll j=n;cnt=0;sum=0;
while(j){
if(j>=k){
j-=k;
sum+=k;
// if(k==2)
// cout<<j<<endl;
}
else{
sum+=j;
j=0;
}
num=j/10;
j-=num;
// if(k==2)cout<<j<<endl<<endl;
cnt++;
}
if(n%2==0){
if(sum>=n/2){
printf("%lld\n",k);
return 0;
}
}
else{
if(sum>=(n+1)/2){
printf("%lld\n",k);
return 0;
}
}
}
return 0;
}
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
bool check(ll x){
ll j=n,sum=0;
while(j){
if(j>=x){
j-=x;
sum+=x;
}
else{
sum+=j;
j=0;
break;
}
ll num=j/10;
j-=num;
}
if(n%2==0){
if(sum>=n/2)return true;
else return false;
}
else{
if(sum>=(n+1)/2)return true;
else return false;
}
}
ll binary(ll l,ll r){
ll mid,ans;
while(l<=r){
mid=l+(r-l)/2;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
int main(){
scanf("%lld",&n);
printf("%lld\n",binary(1,n));
return 0;
}