A.统计总时间,从总时间开始找第一个能提交的点。
#include<bits/stdc++.h> using namespace std; int n,m,a[1005],ok[100005] = {0}; int main() { ios::sync_with_stdio(0); cin >> n; int sum = 0; for(int i = 1;i <= n;i++) cin >> a[i],sum += a[i]; cin >> m; for(int i = 1;i <= m;i++) { int x,y; cin >> x >>y; for(int j = x;j <= y;j++) ok[j] = 1; } for(int i = sum;i <= 100000;i++) { if(ok[i]) { cout << i << endl; return 0; } } cout << -1 << endl; return 0; }
B.把每个unlucky值都算出来,再算最长段。
#include<bits/stdc++.h> using namespace std; long long x,y,l,r,a[105],b[105]; int main() { ios::sync_with_stdio(0); cin >> x >> y >> l >> r; int cnt1 = 0,cnt2 = 0; a[++cnt1] = 1; b[++cnt2] = 1; while(a[cnt1] <= r/x) { a[cnt1+1] = a[cnt1]*x; cnt1++; } while(b[cnt2] <= r/y) { b[cnt2+1] = b[cnt2]*y; cnt2++; } set<long long> s; for(int i = 1;i <=cnt1;i++) { if(a[i] > r) continue; for(int j = 1;j <= cnt2;j++) { if(b[j] > r) continue; if(a[i]+b[j] < l) continue; if(a[i]+b[j] > r) continue; s.insert(a[i]+b[j]); } } s.insert(l-1); s.insert(r+1); long long ans = 0; for(auto it = ++s.begin();it != s.end();it++) { long long xx = *it; it--; long long yy = *it; it++; ans = max(ans,xx-yy-1); } cout << ans << endl; return 0; }
C.分两种情况,Bob一直往下跑到叶子节点或者先往上跑,再往下跑到更深的叶子节点。
#include<bits/stdc++.h> using namespace std; int n,x,a[200005] = {0},maxx[200005],ok[200005] = {0}; int ans; vector<int> v[200005]; void dfs1(int now,int pre) { maxx[now] = a[now]; for(int i = 0;i < v[now].size();i++) { int t = v[now][i]; if(t == pre) continue; a[t] = a[now]+1; dfs1(t,now); if(ok[t]) ok[now] = 1; maxx[now] = max(maxx[now],maxx[t]); } } int main() { ios::sync_with_stdio(0); cin >> n >> x; ok[x] = 1; for(int i = 1;i < n;i++) { int x,y; cin >> x >> y; v[x].push_back(y); v[y].push_back(x); } dfs1(1,-1); ans = maxx[x]; for(int i = 2;i <= n;i++) { if(ok[i]) { if(a[x]-a[i] < a[i]) ans = max(ans,maxx[i]); } } cout << ans*2 << endl; return 0; }