[vijos1246]文科生的悲哀(二) 动态规划
背景
化学不及格的Matrix67无奈选择了文科。他必须硬着头皮艰难地进行着文科的学习。
描述
这学期的政治、历史和地理课本各有n章。每一科的教学必须按章节从前往后依次进行。若干章政治、若干章历史和若干章的地理内容可以合成一个教学阶段。年级计划将整个学期的内容分成若干个阶段进行教学。为了保证各科教学进度相同,年级规定每一个阶段包含的各科的章节数必须相同。一个阶段包含的章节越多,这个阶段所需要的课时也就越多。经过研究,假如某个阶段包含政史地各k章,则政治学习需要花费3^k天的课时,历史学习需要花费5^k天的课时,地理学习需要花费2^k天的课时,最后还需要4天的综合训练。一个阶段所花费的总时间是以上四项时间的和。
为了便于安排时间,学校希望每个阶段恰好需要若干周来完成。因此,划分出的每一个阶段所需要的天数都必须是7的整数倍(高三是没有星期六和星期天的)。
那么,这学期的课程最多可以划分成多少个阶段呢?你会想到,要想划分的阶段数最多,一个阶段完成一章的任务就行了(因为3^1+5^1+2^1+4=14是7的整数倍)。但问题没有这么简单。每个课本都可能有一些独立性较强的连续章节,它们具有很强的连续性,必须在一个阶段中完成。如果你已知所有不能划分在两个或两个以上的阶段中的连续章节,你还能计算出最多能安排多少个阶段吗?
格式
输入格式
第一行有两个用空格隔开的正整数n和m,分别表示各科课本的章节数和不可分割的连续章节的个数。
第二行到第m+1行,每行告诉了一个信息,该信息说明了哪一个课本的第几章到第几章必须一次性完成。同一科目给定的章节有可能重复或有重叠。
每一行信息分为两个部分。第一部分是“Politics:”、“History:”、“Geography:”三个字符串中的一个;第二部分是用“-”连接的两个数字x,y(1<=x<y<=n),表示该行第一部分所示的课本从第x章到第y章具有连续性。第二部分紧接在第一部分后面,没有任何符号分隔。
对于30%的数据,n,m<=10;
对于50%的数据,n,m<=1000;
对于100%的数据,n,m<=100 000。
输出格式
一个正整数,表示按照学校和年级的种种要求(见下)最多可以安排的阶段个数。
如果没有符合条件的安排方案,请输出-1。
注意:以下三个要求需要同时考虑。
1.每一个阶段包含的各科章数相同;
2.按时间函数计算出的各阶段所需天数必须是7的倍数;
3.给出的任一个连续章节都不能被分割开来。
样例1
样例输入1
8 3
Politics:1-2
History:5-6
Politics:1-4
样例输出1
3
限制
各个测试点1s
提示
样例说明:
最多可以安排三个阶段,具体方案如下:
第一阶段完成各科第1-6章的课程
第二阶段完成各科第7章的课程
第三阶段完成各科第8章的课程
Sample Input #2:
4 2
Geography:1-3
History:2-4
Sample Output #2:
-1
这道题做了我一个上午………………orz
一开始十分天真,注意到区间显然是可以合并之后(可以合并是因为一个阶段各科章节数一样)直接贪心了,能搞成一个阶段就搞成一个阶段……完美WA50
事实上这个数据贪心就过不了:
18 3
Politics:3-6
Geography:7-12
History:13-18
贪心结果是-1,正解是3。
接着开始找题解但是却找不到,于是开始手糊正解。先是注意到,满足条件的章节数%6必然<3,且只有在区间交接处才有答案,其他地方都为-1;
先合并区间并用pre[i]表示以i结尾的区间的起始位置。计算f[i]时只需用pre[i],pre[pre[i]],pre[pre[pre[i]]]……中满足条件的更新即可(因为f值并非递增所以不能在第一次更新后就退出)
于是这样你就得到了在vijos上用时1700+s卡过的AC代码
但这不行啊!显然是因为数据水评测机好才过的(xjoi上就T了……so sad……
继续思考,最后发现假如i与某一个j=pre[pre[……pre[i]……]]的距离%6==0,那么显然在j之前对i满足条件的k必然对j也满足条件,所以f[j]就是j及之前的最大可更新值,所以更新后就可以直接跳出啦
愉快的60+s AC~~~
评测结果及代码如下:
| # | 状态 | 耗时 | 内存占用 |
|---|---|---|---|
| #1 | Accepted | 3ms | 4.332MiB |
| #2 | Accepted | 3ms | 4.25MiB |
| #3 | Accepted | 2ms | 4.25MiB |
| #4 | Accepted | 2ms | 2.367MiB |
| #5 | Accepted | 2ms | 2.25MiB |
| #6 | Accepted | 4ms | 4.25MiB |
| #7 | Accepted | 9ms | 3.195MiB |
| #8 | Accepted | 10ms | 3.457MiB |
| #9 | Accepted | 14ms | 3.625MiB |
| #10 | Accepted | 11ms | 4.871MiB |
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
char s[];
int n,m,T[],a[],b[],c[],f[],pre[],ans,d[];
int tdigit(int l,int r){
int x=;
for(int i=l;i<=r;i++)
x=x*+s[i]-'';
return x;
}
void done(int x);
int main(){
scanf("%d%d",&n,&m);
T['P']=;T['H']=;T['G']=;
for(int i=;i<=m;i++){
scanf("%s",s); int x=,y=;
for(int i=T[s[]];i<strlen(s);i++)if(s[i]=='-'){x=tdigit(T[s[]],i-);y=tdigit(i+,strlen(s)-);break;}
a[x]++;d[y]++;
}
int p=,num=,w=;
for(int i=;i<=n;i++){
p+=a[i];p==?c[i]=:c[i]=num;p-=d[i];
if(p==)num++;
}
for(int i=;i<=n;i++)if(c[i]==||c[i]!=c[i+])pre[i]=w,w=i+;
for(int i=;i<=n;i++)if(c[i]!=&&c[i]==c[i+])f[i]=;else done(i);
printf("%d",f[n]?f[n]:-);
}
void done(int x){
int j=pre[x];
while(j){
if(f[j-]&&(x-j+)%<){
f[x]=max(f[x],f[j-]+);
if((x-j+)%==)break;
}
j=pre[j-];
}
if(j==&&f[x]==&&(x-j)%<)f[x]=;
}
[vijos1246]文科生的悲哀(二) 动态规划的更多相关文章
- [vijos1246]文科生的悲哀(二)
[vijos1246]文科生的悲哀(二) 试题描述 化学不及格的Matrix67无奈选择了文科.他必须硬着头皮艰难地进行着文科的学习. 这学期的政治.历史和地理课本各有n章.每一科的教学必须按章节从前 ...
- leetcode算法刷题(二)——动态规划(一)
上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习.. 这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就 ...
- nyist oj 214 单调递增子序列(二) (动态规划经典)
单调递增子序列(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 ,a2...,an}(0<n<=100000).找出单调递增最长子序列,并求出其长度 ...
- ny214 单调递增子序列(二) 动态规划
单调递增子序列(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序 ...
- leetcode 总结 动态规划问题小结
动态规划 动态规划对于子问题重叠的情况特别有效,因为它将子问题的解保存在表格,当需要某个子问题的解 时,直接取值即可,从而避免重复计算. 基本思路与策略 基本思想与分治法类似,也是将带求解的问题分解为 ...
- vijos题解
Vijos题解 题库地址:https://vijos.org/p P1001 谁拿了最多奖学金 题意:按照指定要求计算奖学金,直接用if判断即可 #include<iostream> us ...
- 洛谷 P1736 创意吃鱼法 Label:dp || 前缀和
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 【JAVA、C++】LeetCode 005 Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- Fair Photography
题目大意: 给出直线上N个点的位置和颜色(0或1),求最大的区间,使得区间内0的个数大于等于1的个数且0的个数减去1的个数为偶数. 解题过程: 1.先贴个lsdsjy大牛的线段树的做法:http:// ...
随机推荐
- socket io 记得flush
public class Client { public static void main(String args[]) throws Exception { //为了简单起见,所有的异常都直接往外抛 ...
- webview 详解
[原文] 1. 打开网页时不调用系统浏览器, 而是在本WebView中显示: mWebView.setWebViewClient(new WebViewClient(){ @Override publ ...
- javaScript中的DOM补充
一.DOM树 二.DOM节点 DOM 是这样规定的: 整个文档是一个文档节点 每个 HTML 标签是一个元素节点 包含在 HTML 元素中的文本是文本节点 每一个 HTM ...
- windows下pip安装包权限的问题
md哔了狗了,把scipy弄崩了,还顺带把numpy弄崩了... 然后安装包一直权限不允许: 于是按照下面这篇博客以管理员运行cmd,结果还是没卵用 http://www.cnblogs.com/li ...
- CSDN_帖子__WapPc
CSDN的帖子,Wap版 和 PC版 网址对应关系: 1. 举个例子: 手机版的网址: http://bbs.csdn.net/wap/topics/391891319 PC版的网址: http:// ...
- Intel微处理结构.docx
1. 段寄存器 CS(代码段),代码段是一个存储器区域,这里保存微处理器使用的代码(程序和过程).代码段寄存器定义了存放代码的存储器段的起始地址.在实模式下工作时,它定义一个64KB存储器段的起始地址 ...
- 《Think in Java》(八)多态
"封装"通过合并特征和行为来创建新的数据类型: "实现隐藏"通过将细节"私有化"把接口和实现分离开来: "多态"消除类型 ...
- String随笔
1.古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:,请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 设计思想:1)定义一个String类型 ...
- 通过Intent 打开系统级应用
众所周知,各个手机厂商由于对Android 原生系统定制的原因,会造成系统级应用packname 和activityname 不同的现象,就拿时钟软件来说,魅族2的activityname 是[com ...
- C# 教程(基础理论部分出自网络,一些上机结果为原创)
C# 教程 C# 是一个简单的.现代的.通用的.面向对象的编程语言,它是由微软(Microsoft)开发的. 本教程将告诉您基础的 C# 编程,同时将向您讲解 C# 编程语言相关的各种先进理念.