2021 牛客暑期多校第8場 -K Yet Another Problem About Pi
阿新 • • 發佈:2021-08-10
Yet Another Problem About Pi
這場牛客算是我暑期打多校以來最痛苦的一場,我們隊伍實力從目前看來不得不承認是在區域賽現場賽水平之下,這一點從第一場牛客多校以來到如今的所有比賽可以看出,整場比賽我並沒有去看K,但是通過人數異常的多,隊友交了7發全WA,於是賽後,我查看了題解,其實這道題對自己來說可以說難,說簡單也可,題解的思路並不難,但是自己比賽中能不能想到這是一個重點,我覺得我們整個隊伍目前缺少的是思維力而不是各種演算法,對於當前打銅的目標來說,目前的演算法知識足以,但是隊伍的狀態和思維力是需要當下加強的;
在以上情況基礎上,再往下發展,首先PI是無窮小數,圍繞四個方格中心的消耗我們可以忽略不計,再分成兩種情況
- 往對角線走 貢獻+3
- 沿著短的那條邊走 貢獻+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; }