题目链接:
传送门
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;
ll t, ca, n, c;
int main() {
scanf("%lld", &t);
while(t--) {
scanf("%lld%lld", &n, &c);
if(n == 0) printf("Case %lld: 0\n", ++ca);
else {
//求出对称轴
ll m = c / (2 * n);
//看对称轴偏左和偏右哪边的值更大,横坐标去更大的那一个
if(m * (c - m * n) < (m + 1) * (c - (m + 1) * n)) m++;
printf("Case %lld: %lld\n", ++ca, m);
}
}
}
这道题其实就是一个元二次不等式求最值的问题,但记住输出的是横坐标的值,而不是最大值是多少(这里一定要注意审题)。
有方程可知这是一个开口向下的一元二次方程,最大值在对称轴中取得,但由于我们要取整数而对称轴不一定是个整数,所以我们把对称轴的值在上取整和下取整中取一个最优解即可。