Educational Codeforces Round 60 (Rated for Div. 2) 解題報告
A. Best Subsegment
給定一串數列, 求區間最大平均值
顯然,最大的區間平均值可以就是數列中最大的那個,然後基於最大的點想兩邊列舉區間長度
#include <cstdio> #include <algorithm> inline int Max(int a, int b){return a > b? a: b;} const int N = 1e5 + 1e4; int n, max, max_id, len, rig, max_len; int a[N]; int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); if(a[i] > max) max = a[i]; } for(int i = 1; i <= n; i++){ if(a[i] == max && ( a[i - 1] != max || i == 1 ) ){ rig = i; len = 0; while( a[rig] == a[i] && rig <= n ){ rig++; len++; } max_len = Max(len, max_len); } } printf("%d", max_len); }
B. Emotes
總共 $n$ 個表情, 你需要輸出一個長度為 $m$ 的長度序列,但是同一個表情不能連續出現 $k$ 次
排個序,每個週期按,最大的出現 $k$ 次,然後出現一次第二大的,列舉週期即可
#include <cstdio> #include <algorithm> const int N = 2e5 + 1e4; int n, m, k, tmp; long long ans; int a[N]; bool cmp(int a, int b){ return a > b; } int main(){ scanf("%d%d%d", &n, &m, &k); for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); } std::sort(a + 1, a + n + 1, cmp); if( m <= k ){ printf("%lld", 1LL * a[1] * m); return 0; } else { ans = 1LL * a[1] * k + (long long) a[2]; ans *= (m / (k + 1) ); m %= (k + 1); ans += 1LL * a[1] * m; printf("%lld", ans); } }
C. Magic Ship
本來是到直接兩點座標差的絕對值之和就可以的
然後有洋流
我們設每一輪洋流為一個週期,然後二分最少需要多少週期
然後 $O(n)$ 判斷不在整數週期內部的就可以
#include <cstdio> inline long long Aabs(long long a){return a < 0? (0 - a): a;} const long long N = 1e5 + 1e4; long long x1, y1, x2, y2, dx, dy, n, tmp, ans, mid; char str[N]; int main(){ scanf("%lld%lld", &x1, &y1); scanf("%lld%lld", &x2, &y2); scanf("%lld", &n); scanf("%s", str + 1); for(long long i = 1; i <= n; i++){ if(str[i] == 'U') dy++; if(str[i] == 'D') dy--; if(str[i] == 'L') dx--; if(str[i] == 'R') dx++; } long long left = 0, rig = (int)2e9; while(left <= rig){ mid = (left + rig) >> 1; if( Aabs(x1 + dx * mid - x2) + Aabs(y1 + dy * mid - y2) <= n * mid ) rig = mid - 1; else left = mid + 1; } x1 += dx * rig; y1 += dy * rig; ans = n * rig; if( Aabs(x1 - x2) + Aabs(y1 - y2) <= ans){ printf("%lld", ans); return 0; } for(long long i = 1; i <= n; i++){ if(str[i] == 'U') y1++; if(str[i] == 'D') y1--; if(str[i] == 'L') x1--; if(str[i] == 'R') x1++; ans++; if( Aabs(x1 - x2) + Aabs(y1 - y2) <= ans ){ printf("%lld", ans); return 0; } } printf("-1"); }