[ABC347C] Ideal Holidays题解

原题传送门

原题传送门(洛谷)

​ 题意翻译:

​ 在 \(AtCoder\) 王国中,一个周有 \(A+B\) 天。其中在一周中, \([1,A]\) 天是假日, \([A+1,B]\) 天是工作日。

​ 高桥有 \(N\) 个计划,第 \(i\) 个计划安排在 \(i\) 天后。他不知道今天是周几,但他想知道是否能将计划都安排在假期中;

​ 若可以则打印Yes,否则打印No

​ 题意解释:

如下图,黄绿色的是假期,红色的是假期。

高桥的安排在这个区间中,对此我们可以进行一个状态压缩,也就是把所有的天数对 \(A+B\) 取模,压缩到一个周内;

即:

int sum=a+b;                 //存储A+B
for(int i=1;i<=n;i++){
scanf("%d",d[i]); //输入
d[i]%=sum; //压缩到一周内
}

若有大于 \(A\) 的,便输出No ,于是我们可以写出第一版代码:

#define seq(q, w, e) for (int q = w; q <= e; q++)
#define ll long long
using namespace std;
const int maxn = 2e5+10;
ll n,a,b,sum,num;
ll d[maxn];
signed main()
{
scanf("%lld",&n);
scanf("%lld%lld",&a,&b);
sum=a+b;
seq(i,1,n){
scanf("%lld",&num);
d[i]=num%sum;
}
seq(i,1,n){
if(d[i]>a){
printf("No");
return 0;
}
}
printf("Yes");
return 0;
}

但是会发现错的有点多,这是为啥呢?

我们可以看到,由于高桥不知道今天是周几,所以直接比较行不通。


于是我们想到第二种思路:

用其中最大值减最小值,即求一个区间,看这个区间是否在 \(A\) 以内即可。

即可写出第二版代码:

#define seq(q, w, e) for (int q = w; q <= e; q++)
#define ll long long
using namespace std;
const int maxn = 2e5+10;
ll n,a,b,sum,num;
ll d[maxn];
signed main()
{
scanf("%lld",&n);
scanf("%lld%lld",&a,&b);
sum=a+b;
seq(i,1,n){
scanf("%lld",&num);
d[i]=num%sum;
}
sort(d+1,d+1+n);
num=d[n]-d[1]+1; //区间值
if(num>a){ //区间不在A之内
printf("No");
return 0;
}
printf("Yes");
return 0;
}

但还是会错一个点,这又是为啥呢?

因为如果其跨度超过 \(B\) 我们可以放到下周去做。

​ 如: 使 \(A=2,B=5,N=2,D[]=\{1,7\}\) 对与我们第二种做法,区间值应为 \(7\) ,\(7>A(2)\) ,应输出No

但如果我们假设今天是周一,第一个计划在本周二实现,第二个计划在下周一实现的话,其实是可行的。


为了解决上面的问题,我们要分类讨论一下:

  1. \(sum<=A\) 绝对可以实现,直接输出Yes;

  2. \(sum>A\) :

    1.若相邻两个元素的差有一个大于 \(B\) 则可以实现,直接输出Yes

    ​ (按大小排序,且区间在 \([A,A+B]\) 之间,如果有一个差大于 \(B\) ,则后面的元素于此元素的差都大于 \(B\) )

    2.若相邻两个元素的差都小于 \(B\) 则不可以实现,输出No

根据上面的分析,我们可在二思路上改进一下,即可得出正确代码:

#define seq(q, w, e) for (int q = w; q <= e; q++)
#define ll long long
using namespace std;
const int maxn = 2e5+10;
ll n,a,b,sum;
ll d[maxn];
signed main()
{
scanf("%lld",&n);
scanf("%lld%lld",&a,&b);
sum=a+b;
seq(i,1,n){
scanf("%lld",&d[i]);
d[i]%=sum;
}
sort(d+1,d+1+n);
sum=d[n]-d[1]+1;
if(sum>a){ //区间不在A之内
seq(i,1,n-1){
if(d[i+1]-d[i]-1>=b){ //若有一个差大于B
printf("Yes");
return 0;
}
}
printf("No");
return 0;
}
printf("Yes");
return 0;
}

总的来说,本题对做题者的细心程度非常考察,本蒟蒻在做时吃了九遍罚时,在此感谢 @LiJoQiao 前辈提供思路。

[ABC347C] Ideal Holidays题解的更多相关文章

  1. CF670A Holidays 题解

    Content 假设 \(1\) 年有 \(n\) 天,而每周同样会有 \(5\) 天工作日和 \(2\) 天休假.求一年最小的休假天数和最大休假天数. 数据范围:\(1\leqslant n\leq ...

  2. Codeforces Gym 100187D D. Holidays 排列组合

    D. Holidays Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/D ...

  3. usaco training 4.1.2 Fence Rails 题解

    Fence Rails题解 Burch, Kolstad, and Schrijvers Farmer John is trying to erect a fence around part of h ...

  4. Codeforces Round #350 (Div. 2) A. Holidays 水题

    A. Holidays 题目连接: http://www.codeforces.com/contest/670/problem/A Description On the planet Mars a y ...

  5. 【例题 6-20 UVA - 1599】Ideal Path

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 逆向做一遍bfs. 得到终点到某个点的最短距离. 这样,我们从起点顺序的时候. 就能知道最短路的下一步是要走哪里了. 这样,我们从起 ...

  6. 虚树总结&题单&简要题解

    简介 虚树,即剔除所有无关结点,只保留询问点和询问点的相关结点(两两之间的LCA),建一棵新树,这棵新树就是虚树.通过虚树,可以有效的减小询问(甚至修改)的复杂度.设询问点的个数是\(k\),那么建虚 ...

  7. Codeforces Round #436 (Div. 2) 题解864A 864B 864C 864D 864E 864F

    A. Fair Game time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  8. POJ2482 Stars in Your Window 题解

    Fleeting time does not blur my memory of you. Can it really be 4 years since I first saw you? I stil ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  10. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

随机推荐

  1. dotnet 部署 github 的 Action 进行持续集成

    被微软收购的 GitHub 现在十分土豪,提供了免费的服务器给咱构建.刚好微软对 dotnet 的支持是特别好的,毕竟还算半个自家的东西,大概只需要 3 分钟就可以在 github 上通过 Actio ...

  2. 2018-8-10-WPF-省市县3级联动

    title author date CreateTime categories WPF 省市县3级联动 lindexi 2018-08-10 19:16:53 +0800 2018-2-13 17:2 ...

  3. C语言程序设计-笔记8-结构

    C语言程序设计-笔记8-结构 例9-1  输出平均分最高的学生信息.根据学生的基本信息包括学号.姓名.三门课程成绩以及个人平均成绩.输入n个学生的成绩信息,计算并输出平均分最高的学生信息. #incl ...

  4. js部分数组方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 解决Host key verification failed.(亲测有效)

    哈喽哇,今天在访问远程服务器的时候,出现了一个小问题. 原因:之前ssh联系过服务器,重置服务器后,再次连接服务器,就会出这个问题. 一.发现问题 问题如下图代码: $ ssh root@108.61 ...

  6. docker / compose 的安装 和 体验

    文档 官网文档 视频 视频 简介 课程内容 1.Docker Compose 容器编排 2.Docker Swarm #集群 热扩容 需要在阿里上买服务器,至少冲100+以上的人民币 文档: 集群方式 ...

  7. 若依报错:登录状态已过期,您可以继续留在该页面,或者重新登录;When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header.

    报错界面 后台报错 java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot c ...

  8. pageoffice6 版本实现在线打开word 文件禁止保存、禁止另存、禁止打印的需求

    在实际项目需求中,有时需要限制用户的保存.另存.打印文件操作,实现此效果只需在OnPageOfficeCtrlInit或AfterDocumentOpened事件中调用js设置PageOffice控件 ...

  9. PageOffice 6 版本最简单的打开保存文件

    在OA办公.文档流转等各个Web系统中,实现最简单的打开编辑保存文件功能,调用PageOffice只需要几行代码就可以完成. 后端代码 在后端编写代码调用webOpen方法打开文件之前给SaveFil ...

  10. pyqt5 子线程如何操作主线程GUI

    一.简介 在使用pyqt5编写gui时遇到两个问题,会导致界面崩溃,今天就围绕这两个问题来简单说明和改进. 1.在主线程中使用while无限循环会导致界面崩溃 2.在子线程中操作主线程gui会导致界面 ...