NOIP1999提高组 题解报告
T1 导弹拦截
题目大意:依次有\(n\) (\(n \le 10^5\))枚导弹,一套导弹拦截系统只能拦截一系列高度递减的导弹(一套系统拦截的弹道不一定相邻)。求一套系统最多能拦截多少导弹,以及最少需要几套系统。
很显然,一套系统最多拦截导弹数即为导弹高度的最长不上升子序列,而需要系统数即为最长下降子序列。
直接\(O(nlogn)\)解决即可。
\(Code:\)
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=1e5+5;
int n,a[N],b[N],k1,k2,c[N];
int main()
{
while(~scanf("%d",&a[++n]));--n;
b[++k1]=a[1],c[++k2]=a[1];
for(int i=2;i<=n;++i)
{
if(a[i]<=b[k1]) b[++k1]=a[i];
else
{
int pos=upper_bound(b+1,b+k1+1,a[i],greater<int>())-b;
b[pos]=a[i];
}
if(a[i]>c[k2]) c[++k2]=a[i];
else
{
int pos=lower_bound(c+1,c+k2+1,a[i])-c;
c[pos]=a[i];
}
}
printf("%d\n%d",k1,k2);
return 0;
}
T2 回文数
题目大意:给你一个\(n\)进制数\(m\),可进行在\(n\)进制下的如下操作:\(m\)加上自身的倒序数(如\(56\)和\(65\))。如此反复操作,求多少次操作后可得到一个回文数。
简单的模拟,要注意特判\(n > 10\)的时候。
\(Code:\)
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int x,n,sum,a[1001];
string s;
inline bool hw(int n)
{
for(int i=1;i<=n/2;i++)
if(a[i]!=a[n-i+1]) return false;
return true;
}
inline int jia(int n)
{
int c[1001]={0};
for(int i=1;i<=n;i++)
{
c[i]+=a[i]+a[n-i+1];
c[i+1]+=c[i]/x;
c[i]%=x;
}
if(c[n+1]) n++;
for(int i=n;i>=1;i--) a[i]=c[i];
return n;
}
int main()
{
cin>>x>>s;n=s.size();
for(int i=1;i<=n;++i)
{
if(s[i-1]<65) a[i]=s[i-1]-'0';
else a[i]=s[i-1]-55;//特判字母
}
while(sum<=30)
{
if(hw(n))
{
printf("STEP=%d",sum);
return 0;
}
++sum,n=jia(n);
}
puts("Impossible!");
}
T3 旅行家的预算
题目大意:在长为\(D_1\)一条路上,有\(n\)个加油站,每个加油站有一个油价\(p_i\)和离起点的距离\(d_i\)。现在给出油箱容量\(C\)和每升汽油能行驶的距离\(D_2\),求是否能到终点;如果能,输出最小花费。
仍然是模拟,还加了点贪心。
在一个加油站所需要加的油,就是能够支持它到达下一个油价比它低的加油站的量
如果在这个加油站即使加满油,都不能到达一个比它油价低的加油站,就把油箱加满,前往能够到达的加油站中油价最低的那个(贪心地想,这种决策肯定是能省钱的)
\(Code:\)
#include<cstdio>
#include<algorithm>
using namespace std;
#define db double
int n;
db D1,v,D2,P[233],D[233];
db solve()
{
db s=v*D2;//车能开的距离
db sum=(1.0*D[1]/D2)*P[0];//总费用
db sumD=D[1];
if(D[1]>s) return -1;
db now=P[0];//设为当前使用的油价
for(int i=1;i<=n;++i)
if(P[i]-P[i-1]>s) return -1;
int i=1;
while(i<=n)
{
if(P[i]>=now)
{
sumD+=D[i+1]-D[i];
if(sumD>s)
{
sum+=(1.0*(s-(sumD-(D[i+1]-D[i])))/D2)*now;
now=P[i],sumD=sumD-s;
sum+=(1.0*sumD/D2)*now;
}
else sum+=(1.0*(D[i+1]-D[i])/D2)*now;
++i;
}
else now=P[i],sumD=0;
}
return sum;
}
int main()
{
scanf("%lf%lf%lf%lf%d",&D1,&v,&D2,&P[0],&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&D[i],&P[i]);
D[n+1]=D1;
db sum=solve();
if(sum<0) puts("No Solution");
else printf("%.2lf\n",sum);
return 0;
}
T4 邮票面值设计
题目大意:给定一个信封,最多只允许粘贴\(n\)张邮票,有\(k\)(\(n + k \le 15\))种邮票要用(所有的邮票数量都足够),如何设计邮票的面值,能得到最大值\(MAX\),使在\(1\)至\(MAX\)之间的每一个邮资值都能得到。
很显然是个爆搜题,不过爆搜的范围怎么确定呢?
我们发现,如果令$p = \(选完上一个数可拼成的面值,则当前数的范围为\)[上一个数 + 1 , p + 1]\((这个道理仔细想一下就明白了)
确定最大面值的问题,就可以用完全背包来解决啦!
定义\)dp[i]\(为拼成\)i\(最少需要的邮票数,则状态转移方程为:\)dp[i] = min(dp[i],dp[i - a[j]] + 1)\(
\)Code:$
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
#define rg register
vector<int>ans,temp;
int n,k,dp[2333],Ans;
inline int f()
{
memset(dp,inf,sizeof dp),dp[0]=0;
for(rg int i=1;;++i)
{
for(rg int j=0;j<(int)temp.size() && temp[j]<=i;++j)
dp[i]=min(dp[i],dp[i-temp[j]]+1);
if(dp[i]>n)
{
if(i>Ans+1) Ans=i-1,ans=temp;
return i-1;
}
}
}
inline void dfs(int d)
{
int p=f();
for(rg int i=temp[(int)temp.size()-1]+1;i<=p+1;++i)
{
temp.push_back(i),f();
if(d<k) dfs(d+1);
temp.pop_back();
}
}
int main()
{
scanf("%d%d",&n,&k);temp.push_back(1);
dfs(2);
for(rg int i=0;i<ans.size();++i) printf("%d ",ans[i]);
printf("\nMAX=%d",Ans);
return 0;
}
NOIP1999提高组 题解报告的更多相关文章
- NOIP1998提高组 题解报告
T1 进制位 题目大意:自己看吧 首先让我们来看两个引理: 如果有解,则进制一定为\(n - 1\) 如果有解,则字母一定表示\(0\) 至 \(n - 1\) 的数 证明如下: 因为有 \(n - ...
- NOIP2014提高组 题解报告
D1 T1 无线网路发射器选址 题目大意:找一个矩形,使其覆盖的目标点最大. 题目过水,直接暴力搞过去,代码就不贴了. 但我TM居然有个地方SB了,调了半天才发现输入有问题: scanf(" ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- noip2010提高组题解
NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- NOIP 2001 提高组 题解
NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...
- NOIP 2000 提高组 题解
NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...
- 【NOIP2018】提高组题解
[NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕
- noip2009提高组题解
NOIP2009题解 T1:潜伏者 题目大意:给出一段密文和破译后的明文,一个字母对应一个密文字母,要求破译一段密文,如果有矛盾或有未出现密文无法破译输出failed,否则输出明文. 思路:纯模拟题 ...
随机推荐
- syslog 日志
syslog日志是系统日志的一种,可以存放在本地也可以发送到syslog日志服务器, 但是syslog日志由于的格式不统一,在日常工作中审计syslog日志是一种很麻烦的 事情.不过在2001出现了一 ...
- 【nodejs代理服务器四】代理服务器增加频繁访问的ip加入黑名单
问题 渗透者在扫站的时候会频繁请求,我们可以做一些策略来封堵这些频繁访问的ip,把ip加入黑名单. 策略 2秒之内访问次数超过100,加入黑名单. 实现思路 初次访问把访问Ip作为键,访问ip,时间, ...
- Python基础Day6
一.代码块 一个模块(模块就是py文件),一个函数,一个类,一个文件都是一个代码块,一个整体是一个代码块. 交互模式的每一行都是一个代码块(交互模式:命令提示符),相当于每行都在不同的文件 二.id ...
- java 从上至下打印二叉树
从上往下打印二叉树题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, ...
- NLP学习(4)----word2vec模型
一. 原理 哈弗曼树推导: https://www.cnblogs.com/peghoty/p/3857839.html 负采样推导: http://www.hankcs.com/nlp/word2v ...
- python常用内置方法
常用内建函数# 如何在遍历一个列表的同时获取当前下标? # 普通人的做法 list = [1, 2, 3, 4, 5, 6] index = 0 for i in list: print('下标%s' ...
- 大数据之路week07--day03(Hadoop深入理解,JAVA代码编写WordCount程序,以及扩展升级)
什么是MapReduce 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃. MapReduce方法则是: 1.给在座的所有玩家中分配这摞牌 2.让每个玩家数自己手中的牌有几 ...
- ASP.NET六大巨头——内置对象(2)
前面讲了三个内置对象,后面来探究一下另外三个内置对象Session.Server和Cookie,Session对象就是服务器给客户端的一个编号:Server对象提供对服务器上的方法和属性的访问:coo ...
- CentOS 6.5下快速搭建ftp服务器
来源:Linux社区 作者:Linux CentOS 6.5下快速搭建ftp服务器 1.用root 进入系统 2.使用命令 rpm -qa|grep vsftpd 查看系统是否安装了ftp,若安装了v ...
- 集成百度编辑器 ueditor 后端配置项没有正常加载,上传插件不能正常使用!
项目要用到编辑器,于是集成了ueditor,集成ok,但一直显示 ‘’后端配置项没有正常加载,上传插件不能正常使用!‘’ 各种查: 网上说的无非就是那么集中情况 1. 因为百度官方的问题,php/co ...