A - Elections
题意:
三名候选人参加的选举最近结束。第一名候选人获得a票,第二名候选人获得b票,第三名候选人获得c票。对于每个候选人,解决以下问题:该候选人应获得多少选票才能赢得选举(即该候选人的票数严格大于任何其他候选人的票数)?
思路:
判断该候选人的票数是否严格多余其他候选人的票数,只要该候选人的票数比其他候选人的票数多一票就可以了,我们要做的就是分别处理候选人票数数量的种情况:1.票数全部相同;2.票数全部不同;3.两个候选人的票数相同。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long a,b,c,ans_a,ans_b,ans_c,maxx=-1;
cin>>a>>b>>c;
if(a==b&&a==c)
{
ans_a=1;
ans_b=1;
ans_c=1;
}
else
{
maxx=max(maxx,a);
maxx=max(maxx,b);
maxx=max(maxx,c);
ans_a=abs(maxx-a);
ans_b=abs(maxx-b);
ans_c=abs(maxx-c);
if(a==b)
{
if(ans_a==0)
{
ans_a=1;
ans_b=1;
ans_c=maxx-c+1;
}
else
{
ans_a+=1;
ans_b+=1;
}
}
else if(a==c)
{
if(ans_a==0)
{
ans_a=1;
ans_c=1;
ans_b=maxx-b+1;
}
else
{
ans_a+=1;
ans_c+=1;
}
}
else if(b==c)
{
if(ans_b==0)
{
ans_b=1;
ans_c=1;
ans_a=maxx-a+1;
}
else
{
ans_b+=1;
ans_c+=1;
}
}
else
{
if(ans_a>0)
{
ans_a+=1;
}
if(ans_b>0)
{
ans_b+=1;
}
if(ans_c>0)
{
ans_c+=1;
}
}
}
cout<<ans_a<<" "<<ans_b<<" "<<ans_c<<endl;
}
return 0;
}
B - Make it Divisible by 25
题目:
给定一个整数n,我们每次操作可以删除任意一个数字,如果只剩下一个数字,则无法执行该操作,如果结果数字包含前导零,则会自动删除前导零,求得到一个能被25整除且为正的数的最小操作次数是多少。
思路:
能被25整除的数后两位只有00,25,50,75这四位,所以我们只要在整数n里寻找是否有满足这四种条件的两个数就可以了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
string s;
long long n,num,ans=0x3f3f3f;
cin>>s;
n=s.size();
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
num=(s[i]-'0')*10+(s[j]-'0');
if(num%25==0)
{
ans=min(ans,n-i-2);
}
}
}
cout<<ans<<endl;
}
return 0;
}
C - Save More Mice
题目:
坐标线上有一只猫、k只老鼠和一个洞。cat位于点0,洞位于点n。所有小鼠位于猫与洞之间:第i小鼠位于xi(0<xi<N)。在每一点上,都可以找到许多老鼠。在一秒钟内,会发生以下情况。首先,正好有一只鼠标向右移动1。如果老鼠到达洞,它就会隐藏起来(即老鼠不会再移动到任何点,也不会被猫吃掉)。然后(在老鼠完成移动后),猫向右移动1。如果在新猫的位置上发现了一些老鼠,猫就会吃掉它们(之后它们将无法移动)。这些操作将一直执行到任何鼠标未被隐藏或未被吃掉为止。求不被吃掉就可以到达洞里的老鼠的最大数量是多少。
思路:
以n点位对称点做从0点到n点的老鼠位置的对称位置,我们将老鼠和猫的移动看作猫从0到n移动,老鼠从2n到n移动,那么我们只要求出在猫到达洞之前有多少老鼠能进洞就可以了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[400005];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k,num=0,ans=0;
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+k,cmp);
for(int i=0;i<k;i++)
{
num+=(n-a[i]);
if(num>=n)
{
break;
}
ans++;
}
printf("%d\n",ans);
}
return 0;
}
D - All are Same
题目:
有一个大小为n的序列,我们可以将序列里的元素增加k,求将序列里的数变为相同的数的最大的k,如果k可以任意大就输出-1。
思路:
要让k尽量大,那么我们就要将所有的数变为最大的那个数,所以我们要求的接就是序列里的元素与最大元素的所有差的最大公约数,如果所有的数都相同,那也就是k可以任意大,直接输出-1就可以了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[45];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,ans=0,num;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
num=a[n-1]-a[i];
if(num>0)
{
ans=__gcd(num,ans);
}
}
if(ans==0)
{
cout<<-1<<endl;
}
else
{
cout<<ans<<endl;
}
}
return 0;
}