Codeforces Round #748 (Div. 3)
A - Elections
题意:
有三个候选人,给定他们的初始票数,求每个人要超过其他两个人的现有票数,需要增加的最少的票数。
分析:
计算每个人与其他人的最大差值然后加1就行了,注意差值需满足>=0。
代码:
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
int t;
int a, b, c;
int main(){
ios::sync_with_stdio(false);
cin>>t;
while(t--){
cin >> a >> b >> c;
cout << max({0,b-a+1,c-a+1})<<" ";
cout << max({0,a-b+1,c-b+1})<<" ";
cout << max({0,a-c+1,b-c+1})<<"\n";
}
return 0;
}
B - Make it Divisible by 25
题意:
给定一个整数n,可以删除m个位数上的数值(0<=m<=n),使其可以被25整除,求m的最小值。
分析:
可以被25整除的数,只可能是以00、25、50、75结尾,从数的末尾开始遍历,分为两种情况一种是以0结尾,一种是以1结尾;
拿以0结尾这种情况说明:首先找0,并记录找0过程中遍历的位数个数,然后进一步找0或5,同样记录过程位数,找到便结束遍历。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<deque>
#include<queue>
using namespace std;
typedef long long ll;
///b
ll t;
string s;
int main(){
cin>>t;
while(t--){
cin>>s;
int ans1=0,ans2=0;
int len=s.size();
for(int i=len-1;i>=0;i--){
if(s[i]!='5')
ans1++;
else {
for(int j=i-1;j>=0;j--){
if(s[j]=='2'||s[j]=='7')
break;
else ans1++;
}
break;
}
}
for(int i=len-1;i>=0;i--){
if(s[i]!='0')ans2++;
else {
for(int j=i-1;j>=0;j--){
if(s[j]=='5'||s[j]=='0')
break;
else ans2++;
}
break;
}
}
int ans=min(ans1,ans2);
cout<<ans<<endl;
}
return 0;
}
C - Save More Mice
题意:
有一只猫、k只老鼠和一个老鼠洞,它们在一条直线上,给定它们在这条直线上的坐标,猫的初始位置为0,老鼠为xi(0<xi<n),老鼠洞为n。
每次只允许一只老鼠往右移一步,之后猫也会往右一步。当老鼠和猫在同一位置上时,老鼠会被吃掉;当老鼠跑到洞里了,就是安全的。
问:最多有多少只老鼠能不被吃掉。
分析:
贪心。每次选离洞最近的老鼠进洞。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<deque>
#include<queue>
using namespace std;
typedef long long ll;
///c
int t;
ll n,k;
ll a[400005];
int main(){
cin>>t;
while(t--){
cin>>n>>k;
for(int i=0;i<k;i++){
cin>>a[i];
}
sort(a,a+k);
int cnt=0,d=0;
sort(a,a+k);
for(int i=k-1;i>=0;i--){
if(cnt>=k) break;
if(d<a[i]){
cnt++;
}
d+=n-a[i];
}
cout<<cnt<<endl;
}
return 0;
}