A - Elections
题意:
三个人选举,,已知三个人目前已有的票数分别是A,B,C,问如果某一个人想要胜出,也就是说他的票数得比其他两个人多,那么最少需要多少票?分别输出三个人所需要的票数。
做法:
三个人里面最大值+1减去本身就是需要的最小票数,但是得注意这个最大值是否就是本身,因为自身是最大值时,就不需要再增加票数就已经胜出了。至于为啥WA了三次。。。只能说限制条件真的得好好写呀!!!QAQ!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll a,b,c,t;
cin>>t;
while(t--)
{
cin>>a>>b>>c;
ll maxx=max(a,max(b,c));
if(a==maxx&&b!=maxx&&c!=maxx)
cout<<0<<" ";
else
cout<<maxx+1-a<<" ";
if(b==maxx&&a!=maxx&&c!=maxx)
cout<<0<<" ";
else
cout<<maxx+1-b<<" ";
if(c==maxx&&b!=maxx&&a!=maxx)
cout<<0<<endl;
else
cout<<maxx+1-c<<endl;
}
return 0;
}
B - Make it Divisible by 25
题意:
给定的数字,你可以删除这个数字某一些数位上的数字,然后让原本的数字变成一个全新的数字(前导零的情况数字还是可以的,题目帮着把前导零给去了,所以不用在意),我们需要做的就是把这个数字变成一个25的倍数,最少需要执行几次删除数字的操作?
做法:
25的倍数:25,50,75,100,125,150,175,200.....很明显我们发现25的倍数最低位上必定是00或者25或者50或者75,前面都不需要care!所以判断最后两位即可,推荐把n变成字符串更好操作
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int main()
{
int t;
cin>>t;
while(t--)
{
string n;
int cnt1=0,cnt2=0,flag=0;
cin>>n;
for(int i=n.size()-1;i>=0;i--)
{
cnt1++;
if(!flag&&n[i]=='0')
{
flag=1,cnt1--;
continue;
}
if((n[i]=='0'||n[i]=='5')&&flag)
{
cnt1--;
break;
}
}
flag=0;
for(int i=n.size()-1;i>=0;i--)
{
cnt2++;
if(!flag&&n[i]=='5')
{
flag=1,cnt2--;
continue;
}
if((n[i]=='2'||n[i]=='7')&&flag)
{
cnt2--;
break;
}
}
cout<<min(cnt1,cnt2)<<endl;
}
return 0;
}
C - Save More Mice
题意:
现在有一个数轴从0~无穷,0的位置上有一只猫,然后一共有K只老鼠分布在这个数轴上,在N这个位置有一个鼠洞(老鼠的家)每一次你可以先把一个老鼠移动1,然后在把猫移动1。当猫到达某个位置时,如果这个位置上有老鼠,那么猫会吃掉这位置上的所有老鼠!问最后能有几只老鼠到达N这个位置。活着真难!!!
做法:
试想一下,猫一直都在动,而你每次只能移动一只老鼠,那么是不是从位置最大的老鼠开始移动就可以保证至少可以救下来1只呢,因为老鼠和猫同时移动且每次移动距离相同,猫永远抓不到这只老鼠,所以最优解的情况就是从最大位置的开始移动,同时把猫推进,当猫的位置大于等于你当前要移动的老鼠位置时,就是最大能救下的老鼠个数啦!贪!贪心就完事了!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5+10;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,k;
int pos[maxn];
cin>>n>>k;
for(int i=1;i<=k;i++)
cin>>pos[i];
sort(pos+1,pos+1+k);
int x=0,cnt=0;
while(x<pos[k])
{
x+=(n-pos[k]);
k--,cnt++;
}
cout<<cnt<<endl;
}
return 0;
}
/**
9 8 7 5 4 4 0
8 7 5 4 4 1
9 7 5 4 4 2
7 5 4 4 3
8 5 4
9 5
6
*/
D - All are Same
题意:
给定一个数组,你可以把数组里任意一个元素进行减法操作(把这个数字-K)题目要求最后你要得到一个只存在一个数字的数组,问这个K最大是多少?减法操作可以进行无数次!
做法:
你要保证所有数据都能变成一个值且只通过减法操作,那这个值只能是最小值了呀,没有毛病吧?其次反正你可以操作无数次减法,那么是不是只要关注最大值和最小值的差值就行呢?当然~不是!其他值怎么办,万一根本操作不出来呢?就比如某个值到最小值的差,比你一开始求的差值都要小,这样根本不成立嘛。OMO所以咱就需要去寻找每一个数到最小值的差值的最大公约数呀!这样在保证每一个数据都能到最小值的同时保证的答案的最大化。注意!当数组里只存在一个数字时!!!也就是说最大值最小值的差值为0的时候输出-1!!!QAQ又在这死了一发,就离谱!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4e5+10;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,a[50];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
int ans=a[n]-a[1];
if(ans==0)
{
cout<<-1<<endl;
continue;
}
for(int i=n-1;i>=2;i--)
ans=__gcd(a[i]-a[1],ans);
cout<<ans<<endl;
}
return 0;
}
/**
*/
至于E,下次一定!(开玩笑,明天就补!)