C.排球
思路:反推a,b范围即可
只需讨论2:0,2:1即可,1:2.0:2即为前面两种情况a,b互换的情况,按照顺序判断即可,最优值一定能最先被取到,一个都不符合即为不可能的结果
#include <iostream>
using namespace std;
typedef long long ll;
ll a, b;
int check() {
if (max(a, b) < 50) return 0;
ll p = a, q = b;
p -= 50;
if (p > 0) {
p -= q;
if (p >= -46 && p <= -23)return 1;
}
else {
if (q <= 46) return 1;
}
p = a, q = b;
p -= 50, q -= 25;
if (q >= 0 && p >= 0) {
p -= q;
if (p <= 23 && p >=-46) return 2;
}
p = b, q = a;
p -= 50, q -= 25;
if (q >= 0 && p >= 0) {
p -= q;
if (p <= 23 && p >= -46) return 3;
}
p = b, q = a;
p -= 50;
if (p > 0) {
p -= q ;
if (p >= -46 && p <= -23)return 4;
}
else {
if (q <= 46) return 4;
}
return 0;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%lld%lld", &a, &b);
int a = check();
if (a == 0)printf("Impossible\n");
else if (a == 1)printf("2:0\n");
else if (a == 2)printf("2:1\n");
else if (a == 3)printf("1:2\n");
else printf("0:2\n");
}
return 0;
}
D.香蕉
思路:因为要让不相同的数目最大,可以构造相同数目为s时最小情况,
如当m=5,s=2时,最小需要9个香蕉,1,2,1,2,3
既有最小=s*f(m/s)+(m/s+(m%s>0))*(m%s),f(n)为1-n的等差数列求和
求满足条件的最小相同情况,具有二分性
#include<cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
ll s,m;
ll f(ll n)
{
return (n+1)*n>>1;
}
ll ff(ll mid)
{
return mid*f(m/mid)+(m/mid+(m%mid>0))*(m%mid);
}
int main()
{
int t;
cin >> t;
while(t--)
{
scanf("%lld%lld",&s,&m);
ll l=1,r=m;
while(l<r)
{
ll mid=l+r>>1;
if(ff(mid)<=s) r=mid;
else l=mid+1;
}
printf("%lld\n",l);
}
return 0;
}