P2920 [USACO08NOV]时间管理Time Management

博客提供了洛谷的一道题目链接https://www.luogu.org/problemnew/show/P2920 ,可能与编程学习、算法练习相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.luogu.org/problemnew/show/P2920

#include <ctime>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>//头文件准备
using namespace std;
struct Work{//定义结构体,方便排序
    int v;
    int f;
}work[1005];
int n,ans;
bool cmp(Work x,Work y){
    return x.f>y.f;
}
int main(){
    scanf ("%d",&n);
    for (int i=1;i<=n;i++){
        scanf ("%d %d",&work[i].v,&work[i].f);
    }
    sort (work+1,work+1+n,cmp);//按照结束时间排序
    ans=work[1].f;//一开始答案是最后一件事的结束时间,然后从最后一件事一直模拟到第一件事
    for (int i=1;i<=n;i++){
        if (ans<=work[i].f)ans-=work[i].v;//如果你完成这件事的结束时间是在那件事应该完成时间之前,那么那件事的开始时间就是这件事的结束时间减去这件事的完成所需时间
        else ans=work[i].f-work[i].v;//如果不在应该完成时间之前,那么这件事的开始时间就是这件事应该完成时间减去这件事的完成所需时间
    }
    if (ans<0)printf ("-1\n");//如果FJ无论如何都完不成,就输“-1”(输出格式里有)
    else printf ("%d\n",ans);//否则输出他能睡多久懒觉(。。。真懒)
    while (1);//反抄袭
    return 0;
}
### 关于 USACO 2008 FEB Meteor Shower S 的解题思路 #### 题目概述 题目描述了一种场景,在给定的时间内有若干颗流星会坠落在特定位置并影响周围的区域。贝茜需要找到一条安全路径逃脱,避免被流星击中的同时尽快到达目的地。 #### 解决方法分析 对于此问题的一种有效解决方案是采用广度优先搜索算法(BFS)[^1]。BFS能够帮助探索所有可能的安全移动路线,并记录下最短时间内的逃生路径。具体实现如下: - **初始化队列**:将起点加入到待处理节点列表中。 - **状态表示**:每个状态由当前位置(x,y)及时刻t组成。 - **扩展操作**:从当前状态下尝试向四个方向移动;如果目标格子未受流星影响,则将其作为新的状态压入队列继续考察。 - **终止条件**:一旦发现可以跳出地图边界的位置即视为成功逃离。 为了提高效率,还需要注意以下几点优化措施: - 使用集合来快速判断某个位置是否已经被访问过; - 提前计算好每颗流星的影响范围及其生效时间段,以便高效查询某时刻某处是否安全[^4]。 ```python from collections import deque def bfs(start_x, start_y, meteors): directions = [(0,-1), (-1,0), (0,1), (1,0)] # 初始化受影响时间和坐标表 affected_times = [[set() for _ in range(305)] for __ in range(305)] for t,x,y in meteors: for dx,dy in ((0,0),(0,-1),(-1,0),(0,1),(1,0)): nx,ny=x+dx, y+dy if 0<=nx<305 and 0<=ny<305: affected_times[nx][ny].add(t) queue = deque([(start_x,start_y,0)]) visited = set() while queue: cx,cy,time=queue.popleft() if not (0 <= cx < 305 and 0 <= cy < 305): return time if (cx,cy,time) in visited: continue visited.add((cx,cy,time)) next_time=time+1 for dx, dy in directions: nx=cx+dx; ny=cy+dy if next_time not in affected_times[nx][ny]: queue.append((nx,ny,next_time)) return "IMPOSSIBLE" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值