AtCoder Regular Contest 094
C题题意:给定三个数,每次可以进行两种操作,第一种将两个数+1,第二种将一个数+2,求最小操作次数使得三个数相等。
C题题解:将三个数排序后先将最小数一直+2到与第二数相等,不能相等就最小数和最大数都+1然后继续+2,相等后就是两个数同时+1最后和最大值相同即可。
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 55;
int a[5];
int main(int argc, char const *argv[])
{
for(int i=1;i<=3;i++)cin>>a[i];
sort(a+1,a+4);
int ans = 0;
int k = a[2]-a[1];
if(k&1)ans+=k/2+2;
else ans+=k/2;
ans+=a[3]-a[2];
cout<<ans<<endl;
return 0;
}
D题题意:给定T次询问,每次给定一个人在两场比赛的排名,总得分为排名乘积,求最多可以找到多少个得分比此人小的人。
D题题解:首先计算出该人的得分,然后开方后k=sqrt(points),如果k*(k+1)<points的话那么在中间的时候有双向的两个答案,否则只有一个答案,如points=57,k=7,那么在中间有两个人分别是7,8和8,7,但points=51,k=7,那么中间的就是7,7,只有一个解;然后再考虑分数正好是平方数的,如果自己的分数正好是开方的数那么不影响,如果不是开方的数那么一定有一个小于k的解是该人的排名,然后特判4的情况即可。
AC代码:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int t;
int main(int argc, char const *argv[])
{
cin>>t;
while(t--)
{
long long a,b;
cin>>a>>b;
long long now = a*b;
long long k = sqrt(now);
long long ans = 0;
if(k*(k+1)<now)
{
ans=(k-1)*2+1;
}
else ans = (k-1)*2;
if(k*k==now&&a!=b)ans--;
if(a*b==4)ans=1;
cout<<ans<<endl;
}
return 0;
}
E题题意:两个人每人有N个数,数字和相同,每次每人可以减少自己的其中的一个数,所有数字相同结束,第一人想让次数最多,第二人想让次数最少,求最后的次数。
E题题解:首先都相等次数为0,然后对于第一个人来说,只要当前有不相同的一组数,如果第一个人对的数小,那么一直降下去即可,如果第一个人的数大,那么第一个人就可以将任意一组数降为0,因为哪怕第二个人跟着他,总会有其他一组数不相同,所以最后找到不相同的一组数中第二个人小于第一个人的情况中第二个人的值最小的那一组就是最后留着的一组,最后的结果就是数字和-最后一组。
AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 200007;
int n,a[maxn],b[maxn];
int main(int argc, char const *argv[])
{
cin>>n;
int maxn = 1000000009;
int ok = 0;
long long sum = 0;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
sum+=a[i];
if(a[i]>b[i])
{
if(maxn>b[i])maxn=b[i];
}
}
if(maxn==1000000009)cout<<0<<endl;
else cout<<sum-maxn<<endl;
return 0;
}