zoukankan      html  css  js  c++  java
  • 2021暑期牛客8-K Yet Another Problem About Pi

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

    思路

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

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

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

    不妨设 (wleq 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;
    }
    
  • 相关阅读:
    中国黑客传说:游走在黑暗中的精灵
    智能硬件安全入门
    迈克菲:2016年的八大网络安全威胁
    走进科学之WAF(Web Appllication Firewall)篇
    从对SAE的一次授权安全评估浅谈云安全
    沟通的艺术,心理学与生活,学会提问
    知道创宇研发技能表v3.0
    SYN Cookie的原理和实现
    1043. 输出PATest(20)
    1042. 字符统计(20)
  • 原文地址:https://www.cnblogs.com/ullio/p/15139635.html
Copyright © 2011-2022 走看看