NOIP2014-5-24模拟赛
Problem 1 护花(flower.cpp/c/pas)
【题目描述】
约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时候,他看到了一幕惨剧:牛们正躲在他的花园里,啃食着他心爱的美丽花朵!为了使接下来花朵的损失最小,约翰赶紧采取行动,把牛们送回牛棚. 牛们从1到N编号.第i只牛所在的位置距离牛棚Ti(1≤Ti≤2000000)分钟的路程,而在约翰开始送她回牛棚之前,她每分钟会啃食Di(1≤Di≤100)朵鲜花.无论多么努力,约翰一次只能送一只牛回棚.而运送第第i只牛事实上需要2Ti分钟,因为来回都需要时间. 写一个程序来决定约翰运送奶牛的顺序,使最终被吞食的花朵数量最小.
【输入格式】
第1行输入N,之后N行每行输入两个整数Ti和Di
【输出格式】
一个整数,表示最小数量的花朵被吞食
【样例输入】
6
3 1
2 5
2 3
3 2
4 1
1 6
【样例输出】
86
【样例解释】
约翰用6,2,3,4,1,5的顺序来运送他的奶牛
Problem 2 修剪草坪(mowlawn.cpp/c/pas)
【题目描述】
在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在,
新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。
然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N
(1 <= N <= 100,000)只排成一排的奶牛,编号为1...N。每只奶牛的效率是不同的,
奶牛i的效率为E_i(0 <= E_i <=
1,000,000,000)。
靠近的奶牛们很熟悉,因此,如果FJ安排超过K(1<=K<=N)只连续的奶牛,那么,这些奶牛就会罢工
去开派对:)。因此,现在FJ需要你的帮助,计算FJ可以得到的最大效率,并且该方案中
没有连续的超过K只奶牛。
【输入格式】
* 第一行:空格隔开的两个整数N和K
* 第二到N+1行:第i+1行有一个整数E_i
【输出格式】
* 第一行:一个值,表示FJ可以得到的最大的效率值。
【样例输入】
5 2
1
2
3
4
5
输入解释:
FJ有5只奶牛,他们的效率为1,2,3,4,5。他们希望选取效率总和最大的奶牛,但是
他不能选取超过2只连续的奶牛
【样例输出】
12
FJ可以选择出了第三只以外的其他奶牛,总的效率为1+2+4+5=12。
Problem 3 虫洞(wormhole.cpp/c/pas)
【题目描述】
John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞(有向边)。其中1<=N<=500,1<=M<=2500,1<=W<=200。 现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗。 John将向你提供F(1<=F<=5)个农场的地图。没有小路会耗费你超过10000秒的时间,当然也没有虫洞回帮你回到超过10000秒以前。
【输入格式】
* Line 1: 一个整数 F, 表示农场个数。
* Line 1 of each
farm: 三个整数 N, M,
W。
* Lines 2..M+1 of
each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条用时T秒的小路。
* Lines M+2..M+W+1 of
each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条可以使John到达T秒前的虫洞。
【输出格式】
* Lines 1..F: 如果John能在这个农场实现他的目标,输出"YES",否则输出"NO"。
【样例输入】
2
3 3 1
1 2 2
1 3 4
2 3 1
3 1 3
3 2 1
1 2 3
2 3 4
3 1 8
【样例输出】
NO
YES
T1:贪心
对于牛i和牛i+1,不妨假设之后的牛D的和为x,
那么如果牛i后运输,吃掉的花为: 2*Ti+1*(x+Di)+2*Ti*x
如果牛i先运输,吃掉的花为:2*Ti*(x+Di+1)+2*Ti+1*x
化简得:Ti+1*Di和Ti*Di+1
即
牛i后运输⇔Ti+1*Di<Ti*Di+1⇔Di/Ti<Di+1/Ti+1
所以排序之后使得任何一对牛都满足上述关系式,不可能存在更优解
注意:开longlong啊,遇到乘法想longlong,要不然爆0真是泪流满面啊~~~
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100005
#define ll long long
using namespace std;
struct Node{
ll T,D;
double p;
Node(){
T=D=;
p=;
}
}s[MAXN];
int n;
ll a[MAXN];
bool comp(const Node &p1,const Node &p2){
return (p1.p<p2.p);
}
int main()
{
// freopen("flower1.in","r",stdin);
// freopen("my.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&s[i].T,&s[i].D);
s[i].p=(double)s[i].D/s[i].T;
}
sort(s+,s+n+,comp);
for(int i=;i<=n;i++){
a[i]=a[i-]+s[i].D;
}
ll ans=;
for(int i=n;i>=;i--){
ans+=(s[i].T**a[i-]);
}
printf("%lld\n",ans);
return ;
}
Code1
T2:
朴素dp很好想,滚动后70分
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100005
#define ll long long
using namespace std;
ll f[MAXN];
ll a[MAXN];
int n,K;
int main()
{
// freopen("data.in","r",stdin);
scanf("%d%d",&n,&K);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=;i<n;i++){
ll temp=;
for(int k=min(i,K);k>=;k--){
if(k+<=K){
f[k+]=max(f[k+],f[k]+a[i+]);
}
temp=max(temp,f[k]);
}
f[]=max(f[],temp);
}
ll ans=;
for(int i=;i<=K;i++){
ans=max(ans,f[i]);
}
printf("%lld\n",ans);
return ;
}
Code2-1
正解是dp+单调队列
正难则反,求扔掉的牛的效率之和
然后f[i]表示
对于前i个牛,我们扔掉i,其余都是正常,
在这种情况下,所有扔掉的牛效率之和的最小值
那么f[i]=min{f[j]+a[i] | i-k-1<=j<=i-1}
实际上我们可以认为此方程中,i扔了,j扔了,i和j之间的都选
然后结果是∑a[i]-min{f[i-k]~f[i]}
这样状态的定义就具有了单调队列所需的“跳动性”,而不是普通dp的连贯性
一般dp连贯性固然好,但是优化时也应该学会打破常规,跳出去
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100005
#define ll long long
using namespace std;
ll read(){
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(''<=ch&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
ll f[MAXN];
int n,k;
ll a[MAXN];
int deq[MAXN];
ll sum;
int main()
{
// freopen("data.in","r",stdin);
n=read();k=read();
for(int i=;i<=n;i++){
a[i]=read();
sum+=a[i];
}
int L=,R=;
for(int i=;i<=n;i++){
f[i]=f[deq[L]]+a[i];
while(L<=R&&f[deq[R]]>=f[i]){
R--;
}
deq[++R]=i;
if(i-k-==deq[L]){
L++;
}
}
ll ans=f[n];
for(int i=n-;i>=n-k;i--){
ans=min(ans,f[i]);
}
printf("%lld",sum-ans);
return ;
}
Code2-2
T3:
就是一个判断负环的问题,用dfs_SPFA即可
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 505
#define MAXM 3005
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(''<=ch&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int first[MAXN],Next[MAXM*],to[MAXM*],Val[MAXM*],cnt;
//double edge
int d[MAXN],b[MAXN];
int n,m,p;
void Add(int x,int y,int w){
Next[++cnt]=first[x];first[x]=cnt;to[cnt]=y;Val[cnt]=w;
}
int SPFA(int x){
//!!!
if(b[x]){
return ;
}
b[x]=;
for(int e=first[x];e;e=Next[e]){
int y=to[e],w=Val[e];
if(d[y]>d[x]+w){
d[y]=d[x]+w;
if(SPFA(y)){
return ;
}
}
}
b[x]=;
return ;
}
void solve(){
memset(first,,sizeof(first));
memset(Next,,sizeof(Next));
memset(to,,sizeof(to));
memset(Val,,sizeof(Val));
memset(d,,sizeof(d));
memset(b,,sizeof(b));
cnt=;
n=read();m=read();p=read();
for(int i=;i<=m;i++){
int x,y,w;
x=read();y=read();w=read();
Add(x,y,w);
Add(y,x,w);
}
for(int i=;i<=p;i++){
int x,y,w;
x=read();y=read();w=read();
Add(x,y,-w);
}
for(int i=;i<=n;i++){
if(SPFA(i)){
printf("YES\n");
return ;
}
}
printf("NO\n");
}
int main()
{
// freopen("wormhole.2.in","r",stdin);
int T;
T=read();
for(int i=;i<=T;i++){
solve();
}
return ;
}
Code3
NOIP2014-5-24模拟赛的更多相关文章
- 2.24 模拟赛 + DIV2 总结
本来实在是不想打了,后来真的手痒. 晚上发现正进行DIV2然后就打了场,模拟,幸好没参加,逆风.排名2400 Codeforces Round #622 (Div. 2) A题十分钟过了 B题http ...
- NOIP2018 模拟赛(二十二)雅礼NOI
Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...
- 7.29NOIP模拟赛
7.29NOIP模拟赛 T1 YSG (1s,64MB,ysg.in,ysg.out) 描述 ysg,yxy,azw 三人正在刷题. 他们每做一题的时间都是一个有理数. 如果在某一时刻,三人同时做完一 ...
- 体育成绩统计——20180801模拟赛T3
体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...
- 2014-9-13 NOIP模拟赛
NOIP2014模拟赛 ——lwher 题目名 环上的游戏 舞蹈课 数位和乘积 源文件 cycle.cpp/c/pas dancingLessons.pas/cpp digit.cpp.cpp/c/p ...
- 2014-10-23 NOIP模拟赛
NOIP2014模拟赛 -----lwher 时限均为1s,内存 256MB 1.Jams倒酒(pour) Jams是一家酒吧的老板,他的酒吧提供2种体积的啤酒,a ml 和 b ml,分别使用容积为 ...
- NOIP2017提高组模拟赛4 (总结)
NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...
- 洛谷 P5594 【XR-4】模拟赛
洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...
- 20180520模拟赛T3——chess
[问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...
- 模拟赛小结:2017 China Collegiate Programming Contest Final (CCPC-Final 2017)
比赛链接:传送门 前期大顺风,2:30金区中游.后期开题乏力,掉到银尾.4:59绝杀I,但罚时太高卡在银首. Problem A - Dogs and Cages 00:09:45 (+) Solve ...
随机推荐
- C语言——第二次作业(2)
作业要求一 PTA作业的提交列表 作业要求二 题目1.删除字符串中数字字符(函数题) 1.设计思路 - (1)算法 第一步:调用定义的函数. 第二步:定义i=0.j=0,i为原字符数组角标,j为删除后 ...
- django搭建web (一)
建立工程 django-admin.py startproject project_name 建立app python manage.py startapp app_name 将app添加进工程中 在 ...
- 视图和URL配置
视图和URL配置 实验简介 上一章里我们介绍了如何创建一个Django项目并启动Django的开发服务器.本章你将学到用Django创建动态网页的基本知识. 同时,也教会大家怎么在本地机器上建立一个独 ...
- python的迭代器、生成器、装饰器
迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...
- Java NIO之选择器
1.简介 前面的文章说了缓冲区,说了通道,本文就来说说 NIO 中另一个重要的实现,即选择器 Selector.在更早的文章中,我简述了几种 IO 模型.如果大家看过之前的文章,并动手写过代码的话.再 ...
- Mego开发文档 - 加载关系数据
加载关系数据 Mego允许您使用模型中的导航属性来加载相关数据对象.目前只支持强制加载数据对象.只有正确配置了关系才能加载关系数据,相关内容可参考关系配置文档. 加载对象属性 您可以使用该Includ ...
- linux下执行java类(运行java定时器)
假如有一个定时器TimerTest.java import java.io.IOException; import java.util.Timer; public class TimerTest { ...
- 新概念英语(1-61)A bad cold
新概念英语(1-61)A bad cold What is good news for Jimmy? A:Where's Jimmy? B:He's in bed. A:What's the matt ...
- FatMouse's Speed ~(基础DP)打印路径的上升子序列
FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take ...
- XML之XPath
1.在 XPath 中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档节点(或称为根节点). 1.1 XPath 术语 节点(Node) 在 XPath 中,有七种类型的节点:元 ...