2021暑期牛客8-K Yet Another Problem About Pi

2021暑期牛客8-K Yet Another Problem About Pi

思路

solution中讲的很清晰了,除了最后那个显然(

这里只证明一下那个显然的内容

在不等式 \(ax+by\leq \pi\) 下最大化 \(2x+3y\) ,其中 \(a=min(w,d) \ \ and \ \ b=\sqrt{w^2+d^2}\)​ ,且 \(x,y\) 为整数

不妨设 \(w\leq d\)​ ,那么 \(a=w\ \ and \ \ b=\sqrt{w^2+d^2} \geq \sqrt2w\)

考虑一个值 \(1.5\) ,当 \(b=1.5w\) 时,我们用 3 个 a 可以交换得到 2 个 b ,且答案不变

那么,当 \(b>1.5w\)​​ 时,用 a 交换 b 会使答案更劣,所以将交换反向答案就会变得更优

而当 \(b<1.5w\)​ 时,用 a 交换 b 会使答案更优

所以,无论什么情况下,最优解一定满足 \(x<3\) 或者满足 \(y<2\)

因为当 \(b>1.5w\) 时,将 2 个 b 换成 大于 3 个 a 显然会使答案更优,所以此时 \(y<2\)

另外同理

代码

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define ll long long
#define ull unsigned long long
#define cint const int&

const int mod = 1e9+7;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int t;
long double pi = acos(-1);
long double w, d;

int main() {
    cin >> t;
    while(t--) {
        int ans = 0;
        cin >> w >> d;
        long double r = sqrt(w*w+d*d);
        w = min(w, d);
        for(int i=0; i<=3; i++) {
            if(w*i < pi) {
                int st = (pi-w*i)/r;
                ans = max(ans, 2*i+3*st);
            }
            if(r*i < pi) {
                int st = (pi-r*i)/w;
                ans = max(ans, 2*st+3*i);
            }
        }
        cout << ans << endl;
    }
    return 0;
}
posted @ 2021-08-14 00:35  ullio  阅读(40)  评论(0编辑  收藏  举报