10.11 noip模拟试题
4题均为128M,1s
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个字符,其中不含空格。
XXX偷懒用读入优化无视字符没想到字符里面由数字QAQ
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 510 #define ll long long using namespace std; ll now,n,falg; char s[100]; struct node{ll a,b,c; }p[maxn]; ll init(){ll x=0,f=1;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}return x*f; } ll Cal(ll x,ll y){if(x%y==0)return x/y;else return x/y+1; } int main() {freopen("exercise.in","r",stdin);freopen("exercise.out","w",stdout);now=init();n=init();for(int i=1;i<=n;i++){+scanf("%s",s);//偷懒毁一生~ p[i].a=init();p[i].b=init();p[i].c=init();}for(int i=1;i<=n;i++){now+=p[i].a-p[i-1].b-1;if(now-(p[i].b-p[i].a+1)*p[i].c+p[i].b-p[i].a+1>0)now=now-(p[i].b-p[i].a+1)*p[i].c+p[i].b-p[i].a+1;else{now=Cal(now+p[i].a*p[i].c-p[i].a-p[i].c+1,p[i].c-1);falg=1;break;}}if(falg)cout<<"Runtime Error"<<endl<<now<<endl;else cout<<"Accepted"<<endl<<now+1440-p[n].b<<endl;return 0; }
View Code
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。
这题有点失败....写了迭代了结果排序排反了
考试时怎么就脑抽小的排在前面了呢 made不排序都比这样过得多....
有个没想到的剪枝:每个猫i放到前i个车里
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 21 using namespace std; int n,m,s,a[maxn],cnt,p=1,falg,c[maxn]; int cmp(int a,int b){return a>b; } void Dfs(int now){if(now==n+1){falg=1;return;}for(int i=1;i<=s&&i<=now;i++){//剪枝 if(c[i]+a[now]<=m){c[i]+=a[now];Dfs(now+1);if(falg)return;c[i]-=a[now];}} } int main() {freopen("catclimb.in","r",stdin);freopen("catclimb.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n,cmp);//大到小!这样规模小! for(int i=1;i<=18;i++){memset(c,0,sizeof(c));s=i;Dfs(1);if(falg){cnt=i;break;}}printf("%d\n",cnt);return 0; }
View Code
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> #define maxn 100010 #define lc k*2 #define rc k*2+1 #define mid (l+r)/2 using namespace std; int n,m,a[maxn],b[maxn],c[maxn],s[maxn*4],num; struct node{int x,y;char z; }p[maxn]; int init(){int x=0,f=1;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}return x*f; } void Insert(int k,int l,int r,int x,int y){if(l==x&&r==x){s[k]+=y;return;}if(x<=mid)Insert(lc,l,mid,x,y);else Insert(rc,mid+1,r,x,y);s[k]=s[lc]+s[rc]; } int Query(int k,int l,int r,int x){if(l==r)return l;if(x>s[lc])return Query(rc,mid+1,r,x-s[lc]);else return Query(lc,l,mid,x); } int main() {freopen("war.in","r",stdin);freopen("war.out","w",stdout);n=init();for(int i=1;i<=n;i++){a[i]=init();b[i]=a[i];c[++num]=a[i];}m=init();for(int i=1;i<=m;i++){cin>>p[i].z;p[i].x=init();if(p[i].z!='Q')p[i].y=init();if(p[i].z=='A'){b[p[i].x]-=p[i].y;if(b[p[i].x]>0)c[++num]=b[p[i].x];}if(p[i].z=='C'&&b[p[i].x]>0){b[p[i].x]+=p[i].y;c[++num]=b[p[i].x];}}sort(c+1,c+1+num);int pos,X,Y;num=unique(c+1,c+1+num)-c-1;for(int i=1;i<=n;i++){pos=lower_bound(c+1,c+1+num,a[i])-c;Insert(1,1,num,pos,1);}for(int i=1;i<=m;i++){if(p[i].z=='Q'){if(s[1]<p[i].x){printf("-1\n");continue;}pos=Query(1,1,num,s[1]-p[i].x+1);printf("%d\n",c[pos]);}if(p[i].z=='A'){X=a[p[i].x];a[p[i].x]-=p[i].y;pos=lower_bound(c+1,c+1+num,X)-c;Insert(1,1,num,pos,-1);Y=a[p[i].x];if(Y<=0)continue;pos=lower_bound(c+1,c+1+num,Y)-c;Insert(1,1,num,pos,1);}if(p[i].z=='C'){X=a[p[i].x];if(X<=0)continue;a[p[i].x]+=p[i].y;pos=lower_bound(c+1,c+1+num,X)-c;Insert(1,1,num,pos,-1);Y=a[p[i].x];pos=lower_bound(c+1,c+1+num,Y)-c;Insert(1,1,num,pos,1);}}printf("%d\n",s[1]);return 0; }
View Code
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范围内
考试四个题 时间不够了最后十分钟大个暴力10分
下午过来15分钟打完正解QAQ
背包+路径输出
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #define maxn 5010 using namespace std; int n,m,f[maxn][maxn/10],p[maxn],path[maxn]; vector<int>c[maxn],v[maxn]; int init(){int x=0,f=1;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}return x*f; } void Dfs(int x,int y){if(x<=0)return;for(int i=0;i<=p[x];i++)if(f[x][y]==f[x-1][y-c[x][i]]+v[x][i]){path[x]=i+1;Dfs(x-1,y-c[x][i]);} } int main() {freopen("diablo.in","r",stdin);freopen("diablo.out","w",stdout);n=init();m=init();int ci,vi;for(int i=1;i<=n;i++){ci=init();p[i]=init();for(int j=1;j<=p[i];j++){vi=init();c[i].push_back(ci*j);v[i].push_back(vi);}c[i].push_back(0);v[i].push_back(0);}for(int i=1;i<=n;i++)for(int j=m;j>=0;j--){int s=c[i].size();f[i][j]=f[i-1][j];for(int k=0;k<s;k++)if(j>=c[i][k])f[i][j]=max(f[i][j],f[i-1][j-c[i][k]]+v[i][k]);}printf("%d\n",f[n][m]);Dfs(n,m);for(int i=1;i<=n;i++)printf("%d\n",path[i]%(p[i]+1));return 0; }
View Code
转载于:https://www.cnblogs.com/yanlifneg/p/5949155.html
10.11 noip模拟试题相关推荐
- 10.27 noip模拟试题
1.铺瓷砖 (tile.cpp/c/pas) [问题描述] 有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷 砖,你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴 ...
- NOIP模拟试题详讲2021/11/9
T1 题目大意: 对于一个长度为n,1的个数有k的01串,求出有最多含有奇数个1的区间的数量,和任意一种满足的方案. 找规律,本蒟蒻写了一个暴力发现: 1.最大数量不受k的影响. 2.最优解的方案肯定 ...
- NOIP模拟试题2021/11/11
T1 对于要走到终点,如果无法直接走到,我们就要在环上绕,由于绕一个环可能会有多余的部分绕,对于一条能够到达终点的路径,途中遇到还不能走的边,我们就要去绕环,所以我们考虑找到每条能够到终点的路径的要解 ...
- 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)
传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码 转载于: ...
- 2018.10.26 NOIP模拟 瓶子 (dp/贪心)
传送门 正解是dp并不想去想了. 自己yy了一个贪心拿了95pts95pts95pts,唯一没过的点还只有一个地方错了,面向数据变成之后过啦! 所以我讲讲如何贪心. 考虑到最后都只会合并成一种颜色,所 ...
- 2018.10.24 NOIP模拟 小 C 的序列(链表+数论)
传送门 考虑到a[l],gcd(a[l],a[l+1]),gcd(a[l],a[l+1],a[l+2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l+1]),gcd(a[ ...
- 8.11 NOIP模拟测试17 入阵曲+将军令+星空
T1 入阵曲 前缀和维护可以得60分 f[x1][y1][x2][y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]; O(n4) ...
- 2018.10.01 NOIP模拟 卡牌游戏(贪心)
传送门 简单贪心题. 然而考试的时候失了智少讨论了一种情况导致gg. 实际上用到了二分图匹配的思想,L每次找到刚好比当前的牌小一点的出出去,看能匹配几个. 如何处理? 我们先考虑第一种比分策略. 我们 ...
- 2018.10.04 NOIP模拟 航班(tarjan+树形dp)
传送门 考场上自己yy了一个双连通只有40分. 然后换根dp求最长路就行了. 代码 转载于:https://www.cnblogs.com/ldxcaicai/p/10084917.html
- 2019.10.3 noip模拟赛
T1 天空龙 巨水,不讲. T3 太阳神 [问题描述] 太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍 数的题目. 求满足如下条件的数对(a,b)对数: a,b 均为正整数且 a,b< ...
最新文章
- android环境安装之android4.2安装(转)
- CloudFoundry命令行安装和卸载插件
- 使用pm2启动Node和Vue项目教程
- SqlServer SqlBulkCopy批量插入 -- 多张表同时插入(事务)
- mybatis注解开发_快速搭建MyBatis开发环境(配置版+注解版)
- (八):构建WineLib DLL
- 腾讯会议开放API接口,为企业打造专属的“腾讯会议”
- 解决cmd命令行窗口和 powershell 汉字显示乱码问题
- flex连接mysql,flex对数据库(sqlite)的操作
- linux安装并行geant4,Ubuntu下安装Geant4精选.pdf
- C++ 中 ifstream读取txt文件内容
- CNVD和CNNVD披露漏洞教程(个人申报)
- Matlab中的数据预处理-归一化(mapminmax)
- 汽车故障诊断技术【3】
- JAVA后台实现文件批量下载
- spark写入Oracle 报错 java.lang.ArrayIndexOutOfBoundsException: -32423
- linux dpm机制分析
- Mac中删除docker镜像
- 海龟编辑器怎么运行html,海龟编辑器绘制五角星的操作流程
- vue-seamless-scroll 无缝滚动 使用方法
热门文章
- android:layout_height、android:layout_width、android:height、android:width的关系与区别
- 库没启动,报:ORA-01034: ORACLE not available
- 彻底明白Java的IO系统
- VSCode使用记录四:Ubuntu终端启动报错以及Ubuntu查看修改文件夹权限
- Daily scrum 10.12
- 哈希集合——hashSet
- android ExpandableListView
- 测试标准I/O缓冲的代码,
- JavaScript异步编程的四种方法(转)
- php底层深度探索(3) ---Apache启动阶段分析 王泽宾