2014-10-6 NOIP模拟赛
1. 锻炼计划(exercise.pas)
身体是革命的本钱,OIers不要因为紧张的学习和整天在电脑前而忽视了健康问题。小x设计了自己的锻炼计划,但他不知道这个计划是否可行,换句话说如果计划不当可能会让他的体力超支,所以小x请你帮助他。
一天有1440分钟,所以小x列出的是这一整天第1至第1440分钟的计划。小x的体力用一个整数来表示,他会按照计划表进行锻炼,同时,每分钟小x的体力会自动增加1。如果某一分钟末小x的体力小于等于零,那么可怜的小x就累死了……
输入(exercise.in)
第一行是用空格分开的两个整数n,m,分别表示小x的初始体力值和计划的项目数量。
从第二行开始的m行,每行描述一个锻炼项目:名称、开始时间a、结束时间b、每分钟耗费的体力(用空格分隔),表示此项目从第a分钟初开始,第b分钟末结束。锻炼项目按照开始时间递增顺序给出,不会出现两个项目时间冲突的情况。
输出(exercise.out)
输出包括两行,如果计划可行,第一行输出"Accepted",第二行输出这一天过后最后剩余的体力;否则在第一行输出"Runtime Error",第二行输出在第几分钟累死。
样例
Input |
Output |
10 1 Basketball 1 10 1 |
Accepted 1440 |
1 1 Nunchakus 1 1 2 |
Runtime Error 1 |
约定
0<n<=2^31-1
0<=m<=500
所有中间值的绝对值不会超过2^31-1
每一个锻炼项目的名称不超过20个字符,其中不含空格。
/*
线段树维护每分钟消耗的体力,每个运动相当于一个区间查询
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 510
long long s,a[],b[];
int n;
char ch[];
struct node{
int l,r;
long long v,lazy;
}tr[maxn<<];
long long qread(){
long long i=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i;
}
void build(int l,int r,int k){
tr[k].l=l;tr[k].r=r;
if(l==r)return;
int mid=(l+r)>>;
build(l,mid,k<<);
build(mid+,r,k<<|);
}
void updata(int k){
if(tr[k].l==tr[k].r)return;
int l,r;
long long v=tr[k].lazy;
l=tr[k<<].l;r=tr[k<<].r;
tr[k<<].v=(r-l+)*v;
tr[k<<].lazy+=v; l=tr[k<<|].l,r=tr[k<<|].r;
tr[k<<|].v=(r-l+)*v;
tr[k<<|].lazy+=v;
tr[k].lazy=;
}
void change(int l,int r,long long v,int k){
if(tr[k].l>=l&&tr[k].r<=r){
tr[k].v+=(tr[k].r-tr[k].l+)*v;
tr[k].lazy+=v;
return;
}
if(tr[k].lazy)updata(k);
int mid=(tr[k].l+tr[k].r)>>;
if(l<=mid)change(l,r,v,k<<);
if(r>mid)change(l,r,v,k<<|);
tr[k].v=tr[k<<].v+tr[k<<|].v;
}
long long find(int op,int k){
if(tr[k].l==tr[k].r)return tr[k].v;
if(tr[k].lazy)updata(k);
int mid=(tr[k].l+tr[k].r)>>;
if(op<=mid)return find(op,k<<);
if(op>mid)return find(op,k<<|);
tr[k].v=tr[k<<].v+tr[k<<|].v;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("exercise.in","r",stdin);
freopen("exercise.out","w",stdout);
s=qread();
scanf("%d",&n);
int x,y;long long z;
build(,,);
for(int i=;i<=n;i++){
scanf("%s%d%d",ch,&x,&y);
cin>>z;
change(x,y,z,);
}
for(int i=;i<=;i++)a[i]=find(i,);
b[]=s;
for(int i=;i<=;i++){
b[i]=b[i-]+;
b[i]-=a[i];
if(b[i]<=){
printf("Runtime Error\n%d",i);
return ;
}
}
printf("Accepted\n%d",b[]);
return ;
}
100分 线段树
2.小猫爬山(catclimb.pas)
题目描述
Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。
Freda和rainbow只好花钱让它们坐索道下山。索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过W。每租用一辆缆车,Freda和rainbow就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山?
输入格式
第一行包含两个用空格隔开的整数,N和W。
接下来N行每行一个整数,其中第i+1行的整数表示第i只小猫的重量C i。
输出格式
输出一个整数,最少需要多少美元,也就是最少需要多少辆缆车。
样例输入
5 1996
1
2
1994
12
29
样例输出
2
数据范围与约定
对于100%的数据,1<=N<=18,1<=C i <=W<=10^8。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,w,ans,a[],b[];
void dfs(int now,int sum){
if(sum>=ans)return;
if(now==n+){
ans=min(ans,sum);
return;
}
for(int i=;i<=sum;i++){//往以前用过的背包里装
if(b[i]+a[now]<=w){
b[i]+=a[now];
dfs(now+,sum);
b[i]-=a[now];
}
}
if(sum==n)return;
b[sum+]+=a[now];
dfs(now+,sum+);
b[sum+]-=a[now];
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("catclimb.in","r",stdin);
freopen("catclimb.out","w",stdout);
scanf("%d%d",&n,&w);ans=n;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
dfs(,);
printf("%d",ans);
return ;
}
74分 暴力
/*
暴力之前先从大到小排个序
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,w,ans,a[],b[];
void dfs(int now,int sum){
if(sum>=ans)return;
if(now==n+){
ans=min(ans,sum);
return;
}
for(int i=;i<=sum;i++){//往以前用过的背包里装
if(b[i]+a[now]<=w){
b[i]+=a[now];
dfs(now+,sum);
b[i]-=a[now];
}
}
if(sum==n)return;
b[sum+]+=a[now];
dfs(now+,sum+);
b[sum+]-=a[now];
}
bool cmp(int x,int y){
return x>y;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("catclimb.in","r",stdin);
freopen("catclimb.out","w",stdout);
scanf("%d%d",&n,&w);ans=n;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
sort(a+,a+n+,cmp);
dfs(,);
printf("%d",ans);
return ;
}
100分
3.魔兽争霸(war.pas)
小x正在销魂地玩魔兽
他正控制着死亡骑士和n个食尸鬼(编号1~n)去打猎
死亡骑士有个魔法,叫做“死亡缠绕”,可以给食尸鬼补充HP
战斗过程中敌人会对食尸鬼实施攻击,食尸鬼的HP会减少
小x希望随时知道自己部队的情况,即HP值第k多的食尸鬼有多少HP,以便决定如何施放魔法
请同学们帮助他:)
小x向你发出3种信号:(下划线在输入数据中表现为空格)
A_i_a表示敌军向第i个食尸鬼发出了攻击,并使第i个食尸鬼损失了a点HP,如果它的HP<=0,那么这个食尸鬼就死了(Undead也是要死的……)。
敌军不会攻击一个已死的食尸鬼。
C_i_a 表示死亡骑士向第i个食尸鬼放出了死亡缠绕,并使其增加了a点HP。
HP值没有上限。
死亡骑士不会向一个已死的食尸鬼发出死亡缠绕
Q_k 表示小x向你发出询问
输入(war.in)
第一行,一个正整数 n
以后n个整数 表示n个食尸鬼的初始HP值
接着一个正整数m
以下m行 每行一个小x发出的信号
输出(war.out)
对于小x的每个询问,输出HP第k多的食尸鬼有多少HP,如果食尸鬼总数不足k个,输出-1。每个一行数。
最后一行输出一个数:战斗结束后剩余的食尸鬼数
样例
Input |
Output |
5 1 2 3 4 5 10 Q 2 A 4 6 C 1 4 Q 2 A 2 1 A 3 3 A 1 3 Q 4 C 2 10 Q 1 |
4 5 -1 11 3 |
约定
40%的数据 n<=3000 m<=5000
70%的数据 n<=8000 m<=10000
100%的数据 n<=30000 m<=50000
90%的数据随机生成
食尸鬼HP没有上限
数据保证任意时刻食尸鬼的HP值在longint范围内
数据保证A和C命令中的食尸鬼是活着的
输入数据中没有多余空格、换行
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,cnt;
struct node{
int v,id;
}a[];
char ch[];
bool cmp1(node x,node y){return x.v>y.v;}
bool cmp2(node x,node y){return x.id<y.id;}
int main(){
//freopen("in.txt","r",stdin);
freopen("war.in","r",stdin);
freopen("war.out","w",stdout);
scanf("%d",&n);cnt=n;
for(int i=;i<=n;i++)scanf("%d",&a[i].v),a[i].id=i;
int x,y;
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%s",ch);
if(ch[]=='A'){
scanf("%d%d",&x,&y);
if(a[x].v<=)continue;
a[x].v-=y;
if(a[x].v<=)cnt--;
}
if(ch[]=='C'){
scanf("%d%d",&x,&y);
if(a[x].v<=)continue;
a[x].v+=y;
}
if(ch[]=='Q'){
scanf("%d",&x);
if(x>cnt){
printf("-1\n");
continue;
}
sort(a+,a+n+,cmp1);
printf("%d\n",a[x].v);
sort(a+,a+n+,cmp2);
}
}
printf("%d\n",cnt);
return ;
}
30分 暴力
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<map>
#include<algorithm>
#define ll long long
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 tmp;
int n,m,root,size;
int b[],v[],w[],s[],rnd[];
int ls[],rs[];
bool tag[];
void update(int k){s[k]=s[ls[k]]+s[rs[k]]+w[k];}
void rturn(int &k)
{int t=ls[k];ls[k]=rs[t];rs[t]=k;update(k);update(t);k=t;}
void lturn(int &k)
{int t=rs[k];rs[k]=ls[t];ls[t]=k;update(k);update(t);k=t;}
void insert(int &k,int num)
{
if(!k){k=++size;rnd[k]=rand();w[k]=s[k]=;v[k]=num;return;}
s[k]++;
if(num==v[k]){w[k]++;return;}
else if(num<v[k]){insert(ls[k],num);if(rnd[ls[k]]<rnd[k])rturn(k);}
else {insert(rs[k],num);if(rnd[rs[k]]<rnd[k])lturn(k);}
}
void del(int &k,int num)
{
if(!k)return;
if(num==v[k])
{
if(w[k]>){w[k]--;s[k]--;return;}
if(ls[k]*rs[k]==)k=ls[k]+rs[k];
else if(rnd[ls[k]]<rnd[rs[k]]){rturn(k);del(k,num);}
else {lturn(k);del(k,num);}
}
else if(num<v[k])
{del(ls[k],num);s[k]--;}
else {del(rs[k],num);s[k]--;}
}
int query(int k,int x)
{
if(!k)return -;
if(s[ls[k]]>=x)return query(ls[k],x);
else if(x>s[ls[k]]+w[k])return query(rs[k],x-w[k]-s[ls[k]]);
else return k;
}
int main()
{
freopen("war.in","r",stdin);
freopen("war.out","w",stdout);
n=read();
for(int i=;i<=n;i++)b[i]=read();
for(int i=;i<=n;i++)insert(root,b[i]);
m=read();
int k,x;
for(int i=;i<=m;i++)
{
char ch[];
scanf("%s",ch);
if(ch[]=='A')
{
k=read();x=read();
del(root,b[k]);b[k]-=x;
if(b[k]>)insert(root,b[k]);
else n--;
}
else if(ch[]=='C')
{
k=read();x=read();
del(root,b[k]);b[k]+=x;
insert(root,b[k]);
}
else
{
k=read();
if(k>n)puts("-1");
else printf("%d\n",v[query(root,n-k+)]);
}
}
printf("%d\n",n);
return ;
}
100分 主席树
4.暗黑破坏神(diablo.pas)
无聊中的小x玩起了Diablo I...
游戏的主人公有n个魔法
每个魔法分为若干个等级,第i个魔法有p[i]个等级(不包括0)
每个魔法的每个等级都有一个效果值,一个j级的i种魔法的效果值为w[i][j]
魔法升一级需要一本相应的魔法书
购买魔法书需要金币,第i个魔法的魔法书价格为c[i]
而小x只有m个金币(好孩子不用修改器)
你的任务就是帮助小x决定如何购买魔法书才能使所有魔法的效果值之和最大
开始时所有魔法为0级 效果值为0
输入(diablo.in)
第一行 用空格隔开的两个整数n m
以下n行 描述n个魔法
第i+1行描述 第i个魔法 格式如下
c[i] p[i] w[i][1] w[i][2] ... w[i][p[i]]
输出(diablo.out)
第一行输出一个整数,即最大效果值。
以后n行输出你的方案:
第i+1行有一个整数v[i] 表示你决定把第i个魔法学到v[i]级
如果有多解 输出花费金币最少的一组
如果还多解 输出任意一组
样例
Input |
Output |
3 10 1 3 1 2 2 2 3 2 4 6 3 3 2 1 10 |
11 1 0 3 |
约定
0<n<=100
0<m<=500
0<p[i]<=50
0<c[i]<=10
保证输入数据和最终结果在longint范围内
2014-10-6 NOIP模拟赛的更多相关文章
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 2016.10.30 NOIP模拟赛 day2 PM 整理
满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...
- 2016.10.30 NOIP模拟赛 day2 AM 整理
题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分 2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 2018.10.03 NOIP+ 模拟赛 解题报告
得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...
- 2018.10.30 NOIp模拟赛 T1 改造二叉树
[题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...
- 2016.10.29 NOIP模拟赛 PM 考试整理
300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题目存在着诸多的问题: 1.开始的序列是无法消除的( ...
- 2018.10.30 NOIp模拟赛T2 数字对
[题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题. 她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...
随机推荐
- wifi debug command
==================================================================================================== ...
- flask的请求上下文源码解读
一.flask请求上下文源码解读 通过上篇源码分析( ---Flask中的CBV和上下文管理--- ),我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__ ...
- 《avascript 高级程序设计(第三版)》 ---第一章 Javascript简介
这一章主要是介绍了 Javascript的一些历史: 1.Javascript主要由三个部分组成:ECMAScript,DOM,BOM. ECMAScript:现在主流浏览器已经全部支持. DOM:把 ...
- frame标签
frame中有一个属性scrolling,可以这样设置它 <frame src="top.html" noresize scrolling="no"/&g ...
- linux命令学习笔记(47):iostat命令
Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视. 它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况. ...
- sass与compass实战(读书笔记)
// compass create myproject // compass compile // compass compile --force 重新编译未改动的 // compass compil ...
- MySQL条件判断处理函数_20160925
MySQL条件判断处理 一.假如我想把salesperson 分成 5组,计算每个销售分组的业绩 首先先将销售分组 SELECT *, CASE WHEN salesperson IN (" ...
- 【LeetCode】070. Climbing Stairs
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- bzoj 3230 相似子串 —— 后缀数组+二分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3230 先算出每个后缀贡献子串的区间: 然后前缀LCP直接查询,后缀LCP二分长度,查询即可: ...
- SpringMVC之二:配置 Spring MVC
Servlet 3.0规范在2009年12月份就发布了,因此很有可能你会将应用部署到支持Servlet 3.0的Servlet容器之中,如tomcat7.0及以上.在Servlet 3 规范中,可以使 ...