1. 程式人生 > 其它 >2021 牛客暑期多校第8場 -K Yet Another Problem About Pi

2021 牛客暑期多校第8場 -K Yet Another Problem About Pi

Yet Another Problem About Pi

這場牛客算是我暑期打多校以來最痛苦的一場,我們隊伍實力從目前看來不得不承認是在區域賽現場賽水平之下,這一點從第一場牛客多校以來到如今的所有比賽可以看出,整場比賽我並沒有去看K,但是通過人數異常的多,隊友交了7發全WA,於是賽後,我查看了題解,其實這道題對自己來說可以說難,說簡單也可,題解的思路並不難,但是自己比賽中能不能想到這是一個重點,我覺得我們整個隊伍目前缺少的是思維力而不是各種演算法,對於當前打銅的目標來說,目前的演算法知識足以,但是隊伍的狀態和思維力是需要當下加強的;


在以上情況基礎上,再往下發展,首先PI是無窮小數,圍繞四個方格中心的消耗我們可以忽略不計,再分成兩種情況

  1. 往對角線走 貢獻+3
  2. 沿著短的那條邊走 貢獻+2
    直接暴力分兩種情況記錄答案即可
#include<bits/stdc++.h>
#include<unordered_map>
#define INF 0x7f7f7f7f
const int maxn=1e5+7;
#define ll long long
#define dbg(x) cout << #x << " = " << x << endl;
const double eps=1e-7;
using namespace std;
const ll mod=1e9+7;
double PI = acos(-1.0);
int n;
double w, d;
ll check(ll x, double len)
{
    ll ans = 4;//初始4個格子
    ans += x * 3;//對角線的貢獻
    double f = PI - x * len;//剩餘的線的長度
    ll k = f / min(w, d);
    ans += k * 2;//貢獻
    if (k == 0 && x * len == PI)//沒有橫線只有對角線且剛剛好,那麼少3個貢獻
        ans -= 3;
    else if (k && (x * len + k * min(w, d)) == PI)//有橫線少2個
        ans -= 2;
    return ans;
}
int main()
{
    cin >> n;
    while(n--){
        scanf("%lf%lf", &w, &d);
        double len = sqrt(w * w + d * d);//對角線長度
        /*ll l = 0, r = PI / len;//最多畫多少個對角線
        while(l + 5 < r)
        {
 
            ll k = (r - l);
            ll mid1 = l + k / 3;
            ll mid2 = l + k * 2 / 3;
            if (check(mid1, len) < check(mid2, len))
                l = mid1;
            else
                r = mid2;
        }
        */
        ll num = PI / len;
        ll ans = 0;                                     //這裡是為了防止超時的處理
        for (ll i = 0; i <= min(num, (ll)50); i++)      
            ans = max(ans, check(i, len));
 
        for (ll i = max((ll)0, num - 50); i <= num; i++)
            ans = max(ans, check(i, len));
 
        printf("%lld\n", ans);
    }
    return 0;
 
}