noip模拟赛,挺良心的题,考的贼烂(膜一下@来日方长大佬(sdfz rank1))

不多说了,看题吧

1.tower

题面:

铁塔(tower.pas/c/cpp)

题目描述

Rainbow和Freda要在PoeticIsland市的一座山脚下盖房子定居了......
盖房子需要钢材,幸运的是,这里有排成一行的n座废弃的铁塔,从左到右编号为1~n,其中第i座的高度为h[i]。
Rainbow和Freda想盖一座上面小下面大的城堡,并且城堡的层数尽可能多。
因此,他们要把这些铁塔分成尽量多组,每组内的铁塔编号必须是连续的,并且从左到右各组内铁塔的高度之和单调不减。
最后,他们会用每组铁塔所提供的钢材构成一层城堡。
但是Rainbow和Freda简直弱爆了有木有,于是请你帮忙计算一下最多能分成多少组呢?

输入格式:

第一行一个整数n。第二行n个整数,第i个整数表示h[i]。

输出格式:

输出一个整数,表示(n-最多能分成的组数)。

思路:

正解是DP,我手打了一个贪心,20分。。。。。

贪心可以被证明是错的,(2,2,1,3,3,自己看一下),爆搜也会超时

怎么办呢?

DP

我们要求的其实就是将原序列划分为多个子串

且每一个子串长度和连续不降

所以我们可以用前缀和预处理一下

然后开始DP

我们要保证在最后面的合起来的数尽可能的小

所以维护3个数组

dp数组,前缀和数组和最大值数组

线性转移即可

代码(感谢颜神):

#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
inline int get()
{
int n;
char c;
while((c=getchar())||)
{
if(c>=''&&c<='')
{
break;
}
}
n=c-'';
while((c=getchar())||)
{
if(c>=''&&c<='')
{
n=n*+c-'';
}
else
{
return(n);
}
}
}
int dp[][];
int ints[],sums[];
inline int he(int l,int r)
{
if(l==)
{
return(sums[r]);
}
return(sums[r]-sums[l-]);
}
signed main()
{
// freopen("tower.in","r",stdin);
// freopen("tower.out","w",stdout);
memset(dp,,sizeof(dp));
int n=get();
for(register int i=;i<=n;i++)
{
ints[i]=get();
sums[i]=sums[i-]+ints[i];
}
for(register int i=;i<=n;i++)
{
dp[i][]=;
}
for(register int j=;j<=n;j++)
{
int mx=-,k=j;
for(register int i=j;i<=n;i++)
{
while(k>&&he(k-,j-)<=he(j,i))
{
k--;
mx=max(mx,dp[j-][k]);
}
if(k<j)
{
dp[i][j]=mx+;
}
}
}
int maxn=;
for(register int i=;i<=n;i++)
{
maxn=max(maxn,dp[n][i]);
}
cout<<n-maxn<<endl;
fclose(stdin);
fclose(stdout);
return();
}

T2:work

题面:

工作计划(work.pas/c/cpp)

题目描述:

Mark 在无意中了解到了Elf的身世。
在和James商量过之后,好心的他们打算送Elf返回故乡。
然而,去往Gliese的飞船票价高的惊人,他们暂时还付不起这笔费用。
经过一番考虑,Mark打算去额外做一些工作来获得收入。
经过一番调查,Mark发现有N个工作可以做。
做第i件工作所需要的时间为Di,同时也需要一个能力值Ci才可以去做。
每件工作都可以在任意时间开始,也可以做任意多次。
所有的工作给付的报酬都是一致的。
同时,有S个课程可以参加,我们认为今天是第0天,第i个课程在第Mi天开始,持续时间为Li天,课程结束之后能力值会变为Ai。
现在Mark 的能力值为1。
Mark 只能做工作到第T天(因为那是飞船起飞的日子)。
他想知道期限内他最多可以做多少件工作,好决定未来的打算。
于是他找到了applepi。でも、applepiは彼女と一緒に楽しむことが大切だ,(本人翻译:但是applepi和他的女朋友在一起享受是很重要的)所以这个任务就交给你了。

输入格式:

第一行包含三个空格分隔的整数T,S,N。
之后S 行,每行三个整数M,L,A,描述一个课程。
之后N 行,每行两个整数C,D,描述一件工作。

输出格式:

一个整数,表示Mark 最多可以做多少件工作。

思路:

标配DP,切了1个半小时

我们首先去重,确保每个能力值对应的是当前能力值能做到最大的工作效率(比如说能力都是3,一个要3天另一个要4天,我只存3天)

然后我们开始dp

dp数组我开两维,一维代表时间,另一维代表能力

dp[i][j]表示在i这个位置,能力值为j时的最大收益

如果这个位置我们做工作,那么我们工作结束时的最大收益就可以由当前+1转移而来

如果这个位置我们学习,那么我们到学习结束时的最大收益就是当前的最大收益

当然,我们一开始要将数组赋值为负无穷

这样不可能的情况可以被自动排除

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define rii register int i
#define rij register int j
#define inf 1<<30
using namespace std;
int gz[];
struct kc{
int fi[],nl[],sl;
}y[];
int n,t,s,dp[][],mnl;
int main()
{
// freopen("wrk.in","r",stdin);
// freopen("wrk.out","w",stdout);
scanf("%d%d%d",&t,&s,&n);
for(rii=;i<=s;i++)
{
int ltt,kkk,lzn;
scanf("%d%d%d",&ltt,&kkk,&lzn);
y[ltt].sl++;
y[ltt].fi[y[ltt].sl]=kkk+ltt;
y[ltt].nl[y[ltt].sl]=lzn;
mnl=max(mnl,lzn);
}
for(rii=;i<=;i++)
{
gz[i]=inf;
}
for(rii=;i<=n;i++)
{
int ltt,kkk;
scanf("%d%d",&ltt,&kkk);
gz[ltt]=min(gz[ltt],kkk);
}
int cnt=;
for(rii=;i<=;i++)
{
for(rij=;j<=;j++)
{
dp[i][j]=-inf;
}
}
dp[][]=;
for(rii=;i<=t-;i++)
{
int minx=inf;
int maxn=;
for(rij=;j<=mnl;j++)
{
if(i!=)
{
dp[i][j]=max(dp[i][j],dp[i-][j]);
}
minx=min(minx,gz[j]);
if(minx==inf)
{
continue;
}
dp[i+minx][j]=max(dp[i+minx][j],dp[i][j]+);
maxn=max(maxn,dp[i][j]);
}
for(rij=;j<=y[i].sl;j++)
{
dp[y[i].fi[j]][y[i].nl[j]]=max(dp[y[i].fi[j]][y[i].nl[j]],maxn);
}
}
int ans=;
for(rii=;i<=;i++)
{
ans=max(dp[t][i],ans);
}
cout<<ans;
return ;
}

3.holes

题面

树洞(holes.pas/c/cpp)

题目描述

在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树。更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2条路径与其相连。
换句话讲,这些树和树之间的路径构成一张N个点、M条边的无向连通图,而度数大于2的点至多有1个。
近年以来,栖息地频繁收到人类的侵扰。
兔子们联合起来召开了一场会议,决定在其中K棵树上建造树洞。
当危险来临时,每只兔子均会同时前往距离它最近的树洞躲避,路程中花费的时间在数值上等于距离。
为了在最短的时间内让所有兔子脱离危险,请你安排一种建造树洞的方式,使最后一只到达树洞的兔子所花费的时间尽量少。

输入格式

第一行有3个整数N,M,K,分别表示树(兔子)的个数、路径数、计划建造的树洞数。
接下来M行每行三个整数x,y,表示第x棵树和第y棵树之间有一条路径相连。1<=x,y<=N,x≠y,任意两棵树之间至多只有1条路径。

输出格式

一个整数,表示在最优方案下,最后一只到达树洞的兔子所花费的时间。

思路:

一眼看出是一道树上二分

发现只剩下30分钟了,来不及写

于是50pts暴力走人

怎么二分呢?

我们知道他有k个树洞

我们就可以枚举长度

判断此时是否成立即可

2018/7/19 考试(tower,work,holes)的更多相关文章

  1. IDC Digital Transition Annual Festival(2018.10.19)

    时间:2018.10.19地点:北京万达文化酒店

  2. 2018.10.19浪在ACM 集训队第一次测试赛

    2018.10.19浪在ACM 集训队第一次测试赛 待参考资料: [1]:https://blog.csdn.net/XLno_name/article/details/78559973?utm_so ...

  3. 20172319 2018.10.19《Java程序设计教程》第7周课堂实践(补写博客)

    20172319 2018.10.19 <Java程序设计教程>第7周课堂实践 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  4. AI Summit(2018.07.19)

    AI Summit 时间:2018.07.19地点:北京丽都皇冠假日酒店

  5. 2019.3.18考试&2019.3.19考试&2019.3.21考试

    2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...

  6. 2018.08.19 NOIP模拟 number(类数位dp)

    Number 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的. 比如 13 是好的,因为 13 = 9 + 3 + ...

  7. 2018.5.19 Oracle数据操作和管理表的综合练习

    --作业一.使用自己的用户登录,完成如下操作,并且创建5条测试数据 -- 创建学生表(stu),字段如下: -- 学号(stuID) -- 姓名(stuName) -- 性别(stuSex) -- 入 ...

  8. 2018.08.19 NOIP模拟 dp(二分+状压dp)

    Dp 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 一块土地有 n 个连续的部分,用 H[1],H[2],-,H[n] 表示每个部分的最初高度.有 n 种泥土可用,他们都能覆盖连续 ...

  9. 2018.7.19 . php复习

    PHP程序设计 1.请写出HTML标记meta的完整英文单词:metadata 2.相当于http文件头作用(向浏览器传回正确和精确地显示网页内容的消息)的meta标记的属性是http-equiv 3 ...

随机推荐

  1. mysql无法连接Can't create a new thread (errno 11)

    问题描述: 今天本地navicat连接服务器mysql出错 ,提示ERROR 1135: Can't create a new thread (errno 11); if you are not ou ...

  2. hibernate的各种保存方式的区别 (save,persist,update,saveOrUpdte,merge,flush,lock)

    hibernate的保存hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别:一.预备知识:在所有之前,说明一下,对于hibernate,它的对象有三种状态,t ...

  3. scss-@at-root

    @at-root指令可以使一个或多个规则被限定输出在文档的根层级上,而不是被嵌套在其父选择器下. 下面就通过scss代码实例介绍一下它的作用: 没有使用@at-root命令的默认情况. .parent ...

  4. Ubuntu真机安装

    Ubuntu真机安装 1.Ubuntu安装: (1)启动盘制作: a.下载启动盘制作工具Universal USB Installe,下载地址: b.下载Ubuntu系统镜像,到本地磁盘,官方下载地址 ...

  5. eclipse中copy qualified name使用方式

    转载自:原文:https://blog.csdn.net/love20yh/article/details/81328202 copy qualified name得到的结果可以有2类: 1./use ...

  6. 服务器常用命令之 启用/禁用PING状态

    启用 echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all  (PING的通) 禁用 echo 1 > /proc/sys/net/ipv4/i ...

  7. IT人们给个建议

    开篇声明:我本身是中学老师,师范类大学计算机专业毕业,现在马上研究生学位就要拿上了,平时在学校搞网络维护什么的,事少,业余时间充足,也不想拘泥于做老师拿点工资,觉得白学计算机了,所以也搞些业余开发,如 ...

  8. CF498D Traffic Jams in the Land

    嘟嘟嘟 题面:有n条公路一次连接着n + 1个城市,每一条公路有一个堵塞时刻a[i],如果当前时间能被a[i]整除,那么通过这条公路需要2分钟:否则需要1分钟. 现给出n条公路的a[i],以及m次操作 ...

  9. 关于message pack as3 版本的一些修改。

    玩个人项目的时候,根据前辈的推荐开始用messagepack,分别是py版和as3版: 然后在github上找到了demonsters的as3模块,于是颠屁颠屁地拿来用了,用的时候发现了一些小地方过不 ...

  10. (第六场)Heritage of skywalkert 【玄学】

    题目链接:https://www.nowcoder.com/acm/contest/144/J 标题:J.Heritage of skywalkert | 时间限制:1 秒 | 内存限制:256M s ...