HDU6669 Game
2024-04-13 01:15:05
http://acm.hdu.edu.cn/showproblem.php?pid=6669
题意:有n个任务要依次完成,每个任务都是:只要站在[Li,Ri][L_i,R_i][Li,Ri]区间,就完成了。起点任选,每次走1步或者2步,求最少走几步。
思路:首先读好题,注意依次,不能打乱顺序。首先我们根据第一个与前i个区间不相交的区间在前i个的并区间的右还是左,就可以确定起点,然后依次走就行了,有一个问题是,如果走的步数是奇数,并且再下一个区间还是同方向,可能走到这个区间的下一格更好,这样的话,怎么判断呢?如果用循环,代码写的又长又乱,一直wa。遂开始时预处理好,一直并区间,形成cnt个相邻绝对不相交的区间,然后就好判断了。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1000+100;
const int maxl=1000000+100;
const int INF=0x3f3f3f3f;int T,n,ans,cnt;
struct seg{int l,r;
}a[maxn],b[maxn];int dist(int pos,int p)
{return min(abs(b[pos].l-p),abs(b[pos].r-p));
}void init()
{cin>>n;ans=0;for(int i=1;i<=n;i++)scanf("%d%d",&a[i].l,&a[i].r);cnt=1;b[1]=a[1];for(int i=2;i<=n;i++){if(a[i].l>b[cnt].r || a[i].r<b[cnt].l)b[++cnt]=a[i];else{b[cnt].l=max(b[cnt].l,a[i].l);b[cnt].r=min(b[cnt].r,a[i].r);} }
}void solve()
{if(cnt==1)return;int p;if(b[2].l>b[1].r)p=b[1].r;else p=b[1].l;for(int i=2;i<=cnt;i++){if(b[i].l>b[i-1].r){int d=b[i].l-p;if((d&1) && b[i].l+1<=b[i].r && b[i+1].l>b[i].r)p=b[i].l+1;else p=b[i].l;ans+=ceil(1.0*d/2);}else{int d=p-b[i].r;if((d&1) && b[i].r-1>=b[i].l && b[i+1].r<b[i].l)p=b[i].r-1;else p=b[i].r;ans+=ceil(1.0*d/2);}}
}int main()
{// freopen("input.in","r",stdin);cin>>T;while(T--){ init();solve();cout<<ans<<endl;}return 0;
}
HDU6669 Game相关推荐
- Game(HDU-6669)
Problem Description 度度熊在玩一个好玩的游戏. 游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格. 现在他要依次完成 n 个任 ...
- 基础算法 —— 贪心算法
[概述] 贪心算法是从问题的初始状态出发,通过若干次的贪心选择而得到的最优值的一种求解策略,即贪心策略. 简单来说,贪心策略是一种在每次决策时采取当前意义下最优策略的算法,做出的选择至少在某种约束条件 ...
最新文章
- 深入剖析微软Office Word主控文档利与弊
- Mysql:mysql 控制台程序的提示符 prompt 字符串设置
- 跟正刊学习SCI英文写作——摘要部分的拆解
- 微信开发 网页授权获取用户基本信息
- IOS关于键盘的弹出和收起
- 268 missing number
- ## c 连接字符_用于字符比较的C#程序
- sd省队集训d1t1
- json数据出现$ref: $.list[0]的解决办法
- 毕设题目:Matlab验证码识别
- 计算机组成原理第三版第四章,计算机组成原理第四章答案
- PLSQL和ORACLE客户端安装
- sqlserver用sql语句备份数据库
- win10WIFI图标消失,只显示一个带红叉的窗口(或者飞行模式的符号)
- 火焰纹章16进制是怎么算_火焰是值得你的时间
- 无线路由器经常掉线怎么办?
- 用java输出出生日期,生成随机出生日期
- 如何使用 Docker 部署一个私有化的为知笔记
- 如何判断横屏还是竖屏?
- ORA-28000 帐户已被锁定问题处理