PTA甲级
1017 Queueing at Bank
可以使用小顶堆模拟窗口的情况,一定是最小的时间的窗口先空出来
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>using namespace std;struct people
{int time;int process;
};
int n , k;
vector<people>v;
int close = 17 * 3600 + 1;
priority_queue<int , vector<int> , greater<int>>window;bool cmp(people a,people b)
{return a.time < b.time;
}int main()
{cin >> n >> k;for(int i = 0;i < n;i ++){int h , m , s , p;scanf("%d:%d:%d %d" ,&h ,&m ,&s ,&p);int t = h * 3600 + m * 60 + s;if(t >= 61201) continue;v.push_back({t , p * 60}); // p是分钟}sort(v.begin() , v.end() , cmp);for(int i = 0;i < k;i ++) window.push(28800);double res = 0;for(auto i : v){int t = i.time , p = i.process;int w = window.top(); // 最早结束的窗口window.pop();if(w > t){res += w - t;window.push(p + w);}else window.push(p + t);}//注意 注意 注意 有可能cnt为0if(v.size()) printf("%.1lf" , (res / 60.0 / v.size()));else puts("0.0");
}
1018 Public Bike Management
真的阴间,经典的dfs
#include<iostream>
#include<unordered_map>
#include<vector>
#include<cstring>using namespace std;const int N = 510;int c , n , s , m;
int bike[N];
int g[N][N];
int dist[N];vector<int>path;
vector<int>res; // 存最终的路径
int send , last , all_dist = 0x3f3f3f3f;void dfs(int u , int cursend , int curlast , int curdist)
{if(curdist > dist[u]) return ;path.push_back(u);if(u == s) // 走到终点{if(all_dist > curdist || all_dist == curdist && send > cursend) // 之前的路径长{res = path;all_dist = curdist;send = cursend;last = curlast;}// 阴间题目怎么不说清楚呢if(all_dist == curdist && send == cursend && last > curlast){res = path;all_dist = curdist;send = cursend;last = curlast;}}else{if(curdist < dist[u]) dist[u] = curdist;for(int i = 1;i <= n;i ++){if(g[u][i]){if(c > bike[i] + curlast) dfs(i , c - bike[i] - curlast + cursend , 0 , curdist + g[u][i]); // 需要放入自行车从last中取else dfs(i , cursend , curlast + bike[i] - c , curdist + g[u][i]);}}}path.pop_back();
}int main()
{memset(dist , 0x3f , sizeof dist);memset(g , 0x3f , sizeof g);scanf("%d %d %d %d" ,&c ,&n ,&s ,&m);for(int i = 1;i <= n;i ++) scanf("%d" ,&bike[i]);while(m --){int a , b , d;scanf("%d %d %d" ,&a ,&b ,&d);g[a][b] = g[b][a] = d;}c /= 2;dfs(0 , 0 , 0 , 0);printf("%d " , send);for(int i = 0;i < res.size();i ++){if(i) printf("->");printf("%d" , res[i]);}printf(" %d" , last);
}
1021 Deepest Root
依然是dfs,注意不能使用unordered_map会超时
#include<iostream>
#include<vector>
#include<set>
#include<cstring>using namespace std;const int N = 1e5 + 10;
int n;
vector<int>mp[N];
vector<int>res[N];
bool st[N];
int depth[N];
int p[N];int find(int x)
{if(p[x] != x) p[x] = find(p[x]);return p[x];
}void dfs(int u , int dep , int &h)
{h = max(h , dep);if(st[u]) return ;if(!mp[u].size()) return ;st[u] = true;for(auto i : mp[u])dfs(i , dep + 1 , h);
}int main()
{scanf("%d" ,&n);int cnt = n;for(int i = 1;i <= n;i ++) p[i] = i;for(int i = 0;i < n - 1;i ++){int a , b;scanf("%d %d" ,&a ,&b);int pa = find(a) , pb = find(b);if(pa != pb) p[pa] = pb , cnt --;mp[a].push_back(b) , mp[b].push_back(a);}if(cnt > 1) {printf("Error: %d components", cnt);return 0;}int maxx = 1;for(int i = 1;i <= n;i ++){memset(st , 0 , sizeof st);int h = 1;dfs(i , 1 , h);maxx = max(maxx , h);res[h].push_back(i);}for(auto i : res[maxx])printf("%d\n" , i);return 0;
}