寒假刷题第四天

PTA甲级

1017 Queueing at Bank

可以使用小顶堆模拟窗口的情况,一定是最小的时间的窗口先空出来

cpp 复制代码
#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为0
    if(v.size()) printf("%.1lf" , (res / 60.0 / v.size()));
    else puts("0.0");
}

1018 Public Bike Management

真的阴间,经典的dfs

cpp 复制代码
#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会超时

cpp 复制代码
#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;
}
相关推荐
你撅嘴真丑5 小时前
第九章-数字三角形
算法
uesowys5 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder5 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮5 小时前
AI 视觉连载1:像素
算法
智驱力人工智能6 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥6 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风6 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風7 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT067 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法