2021.10.18-2021.10.24(3)
1,A. Elections-Codeforces Round #748 (Div. 3)
题意:abc是三个候选人初赛之后的票数,问如果某一个想要成功竞选还需要多少票。(1,票数需要严格大于2,三个问题相互独立)
题解:三个判断。依次进行三次,首先判断这个人是否大于另外两个人,大于输出0,不大于就选出另外两个中最大的减去这个人并加一。
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll a[10];
ll n,m;
ll i1,i2,i3,i4,i5;
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> a[1]>>a[2]>>a[3];
if(a[1]>a[2]&&a[1]>a[3]) {cout<<0<<' ';}
else {cout<<max(a[2],a[3])-a[1]+1<<' ';}
if(a[2]>a[1]&&a[2]>a[3]) {cout<<0<<' ';}
else {cout<<max(a[1],a[3])-a[2]+1<<' ';}
if(a[3]>a[2]&&a[3]>a[1]) {cout<<0<<' ';}
else {cout<<max(a[2],a[1])-a[3]+1<<' ';}
cout << endl;
}
return 0;
}
解释:如果想要大于另外两个,首先如果已经大于就直接输出,否则,找出另外两个最大的(其实就是三个中最大的)然后相减+1即可。
2,B. Make it Divisible by 25-Codeforces Round #748 (Div. 3)
题意:给出一个数(用字符串表示),要求删掉k个数后能被25整除,求k的最小值。
题解:两大步,每一步中有两小步。(1)从后向前找字符’0’位置m,从m向前找字符’0’或者是字符’5’并计为位置k。当k大于0的时候min=x.size()-m+(m-i1-1)(2)同样只是先找’5’
后找字符’2’或者是’7’。
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
string x;
int n,m,max1,min1;
int i1,i2,i3,i4,i5;
map<int,int > it;
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> x;
it.clear();
min1=99999;
for(i1=x.size()-1;i1>=0;i1--)
if(x[i1]=='0') break;
m=i1;
for(i1=i1-1;i1>=0;i1--)
if(x[i1]=='0'||x[i1]=='5') break;
if(i1<0) min1=99999;
else {min1=x.size()-1-i1-1;}
for(i1=x.size()-1;i1>=0;i1--)
if(x[i1]=='5') break;
m=i1;
for(i1=i1-1;i1>=0;i1--)
if(x[i1]=='2'||x[i1]=='7') break;
if(i1>=0)
{max1=(x.size()-1-i1-1);
min1=min(min1,max1);
}
cout <<min1<< endl;
}
return 0;
}
解释:如果要被25整除最后的数字一定是25,50,75,00,只要找到两个数字,删除两个数中间的数和最后一个数到第二个数之间的数。
3,C. Save More Mice-Codeforces Round #748 (Div. 3)
题意:原点有一只猫,在n处有一个洞,有m只老鼠在原点和洞之间。每一秒只有一只老鼠可以向右移动一格,移动完猫也向右移动一格,如果老鼠和猫在同一点(洞点除外,则老鼠死亡d(ŐдŐ๑)。问有最多多少只老鼠获救。
题解:先对老鼠坐标排序,从最大的开始每次sum=sum+n-a[i]当a[i]<=sum时结束。
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll n,m;
ll i1,i2,i3,i4,i5;
ll a[400010];
ll sum;
int main()
{
int t;
cin >> t;
while(t--)
{
cin>>n>>m;
for(i1=1;i1<=m;i1++)
scanf("%lld",&a[i1]);
sort(a+1,a+1+m);
sum=0;
i2=0;
for(i1=m;i1>=1;i1--)
{
if(a[i1]<=sum) break;
i2++;
sum=sum+n-a[i1];
}
cout <<i2<< endl;
}
return 0;
}
解释:(1)sum其实就是猫走的步数。当猫在老鼠位置时老鼠就无法走了。(2)这题用到了贪心的思想,从后面计算,因为每次只有一只老鼠可以走,最近的先走,如果从从中间计算,会使得后面无法移动被吃,而浪费步数。
4,D1. All are Same-Codeforces Round #748 (Div. 3)(最近很少做d题,能做出来自己都很吃惊ヽ(≧Д≦)ノ)
题意:给定一组数据,问找出整数k,使得部分元素减去k或者k的倍数,使得所有元素的值相同,找出k的最大值,如果k无限大输出-1。
题解:如果所有元素都相同,则输出-1。求出每个元素减去最小值后的值存到数组b里。将数组,求出数组中最大的一个数m。建立循环从m到1判断b中所有元素是否都能整除。如果能就输出。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,min1;
int i1,i2,i3,i5,i4;
int a[100],b[100],c[100];
int main()
{
int t;
cin >> t;
while(t--)
{min1=1383993;
cin >> n;
for(i1=1;i1<=n;i1++)
{
scanf("%d",&a[i1]);
min1=min(min1,a[i1]);
}
sort(a+1,a+1+n);
for(i1=2;i1<=n;i1++)
if(a[i1]!=a[i1-1]) break;
if(i1==n+1) {cout<<-1<<endl;continue;}
m=0;
for(i1=2;i1<=n;i1++)
b[i1]=a[i1]-min1;
sort(b+2,b+1+n);
for(i1=b[n];i1>=1;i1--)
{
for(i2=2;i2<=n;i2++)
{if(b[i2]%i1!=0) break;}
if(i2==n+1) {cout<<i1<<endl;goto L;}
}
cout <<1<< endl;
L:;
}
return 0;
}
解释:如果k值无限大,说明所有所有元素都相同,否则两个不同的数,就算减去两个不同倍数的k之后相同,那k也是有固定大小的。不用考虑会有最小的元素也要减去k,因为这种情况下,其他元素也都多减了一个k。最后一步就是找k的值,最小也就是1因为any number%1==0