NOIP 2001 提高组 题解
NOIP 2001 提高组 题解






No 1. 一元三次方程求解
看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~
数据小 暴力枚举即可
double a,b,c,d;
double x;
int main()
{
ios_base::sync_with_stdio();
cin>>a>>b>>c>>d;
;i<=;i+=)
{
x=i/;
if(abs(a*x*x*x+b*x*x+c*x+d)<0.01)
{
printf("%.2f ",x);
}
}
;
}






No 2. 数的划分
dp/dfs
dp
用f(i,j)表示i这个数分成k份有多少种分法
毫无疑问
f[i][j]=f[i-][j-]+f[i-j][j];
因为 f(i,j) 可以从 f(i-1,j-1)推出 又要保持不下降的分划 所以可以从f(i-j,j)推出
int n,k;
][];
void init()
{
cin>>n>>k;
;i<=n;i++)
{
;j<=i;j++)
{
f[i][j]=inf;
}
}
;i<=n;i++)
{
f[i][]=;
}
}
int main()
{
init();
;i<=n;i++)
{
;j<=i;j++)
{
f[i][j]=f[i-][j-]+f[i-j][j];
}
}
cout<<f[n][k]<<endl;
;
}
dfs
暴力枚举
只要不下降+剪枝就可以了
int n,k;
int ans;
void dfs(int nw,int sum,int num)
{
if(num==k)
{
if(sum==n)
{
ans++;
}
else
{
return;
}
}
if(sum==n)
{
return;
}
for(int i=nw;i<=n-sum;i++)
{
dfs(i,sum+i,num+);
}
return;
}
int main()
{
ios_base::sync_with_stdio();
cin>>n>>k;
;i<=n/;i++)
{
dfs(i,i,);
}
cout<<ans<<endl;
;
}






No 3. 统计单词个数
dp
这几年dp考的好多啊
这题题解我真的不会写 我的写法我自己都看不懂
复制一段
划分这个DP,很基础。
然后,是sum[i][j],第i个字母到第j个字母一共可以形成多少个单词,ccy也用的Dp。
sum[i][j]=sum[i][-1]+(包含可以添加最后一个字母j的单词的总个数)。
ccy,WA在……比如现在可以添加一个新单词,k到j,但是,若果以k为起点,在sum[i][j-1]中已经有过单词,该新单词就不添加。于是乎,ccy光荣地WA掉一个点,因为,
那个点有两个相同的单词,我就扩展了两次。
string s;
int slen;
string words[maxm];
int wordslen[maxm];
int f[maxn][maxm];
int sum[maxn][maxn];
int n,k,m;
void init()
{
string tmp;
cin>>n>>k;
;i<=n;i++)
{
cin>>tmp;
s+=tmp;
}
slen=s.size();
cin>>m;
;i<=m;i++)
{
cin>>words[i];
wordslen[i]=words[i].size();
}
}
int add(int l,int r)
{
;
>=) ans=sum[l][r-];
};
;i<=m;i++)
{
;
if (qd<l) continue;
if (qd==s.find(words[i],qd))
{
if (vis[qd]) continue;
vis[qd]=;
ans++;
;j<=m;j++)
{
int dq=r-wordslen[j];
if (dq==qd)
if (dq==s.find(words[j],dq))
{
ans--;
break;
}
}
}
}
return ans;
}
void gsum()
{
;i<=slen-;i++)
;j++)
{
sum[i][j]=add(i,j);
}
}
void work()
{
;i<=slen-;i++)
f[i][]=sum[][i];
;i<=slen-;i++)
;j<=min(k-,i+);j++)
;u<=i-;u++)
f[i][j]=max(f[i][j],f[u][j-]+sum[u+][i]);
;
)
ans=sum[][slen-];
else
;i<=slen-;i++)
ans=max(ans,f[i][k-]+sum[i+][slen-]);
printf("%d\n",ans);
}
int main()
{
int qn;
qn=;
while(qn--)
{
init();
gsum();
work();
}
;
}






No 4. Car的旅行路线
简单的Dijkstra就可以过了
直接贴代码
struct sb
{
int x,y,c;
} pos[];
];
];
],y[],costt[];
double dis(int x,int y)
{
double k;
k=sqrt(pow(pos[x].x-pos[y].x,)+pow(pos[x].y-pos[y].y,));
if(pos[x].c==pos[y].c)
k*=costt[pos[x].c];
else
k*=costf;
return k;
}
double dij(int st)
{
double min,k;
int i,j,p;
memset(b,,sizeof(b));
memset(d,,sizeof(d));
d[st]=;
; i<=tot; i++)
{
min=1e38;
; j<=tot; j++)
if(!b[j]&&d[j]<min)
{
min=d[j];
p=j;
}
b[p]=;
; j<=tot; j++)
if(!b[j])
d[j]=d[j]>d[p]+dis(p,j)?d[p]+dis(p,j):d[j];
}
k=1e38;
; i<=tot; i++)
{
if(pos[i].c==ed)
; j<=; j++)
k=d[i+j]<k?d[i+j]:k;
if(pos[i].c==ed)
break;
}
return k;
}
main()
{
cin>>tc;
double min=1e38;
int i,j,k;
while(tc)
{
cin>>n>>costf>>st>>ed;
; i<=n; i++)
{
cin>>x[]>>y[]>>x[]>>y[]>>x[]>>y[]>>costt[i];
; j<=; j++)
; k<=; k++)
-k-j]-x[j])+(y[j]-y[k])*(y[-k-j]-y[j])==)
{
x[]=x[k]+x[-k-j]-x[j];
y[]=y[k]+y[-k-j]-y[j];
}
; j<=; j++)
{
pos[++tot].x=x[j];
pos[tot].y=y[j];
pos[tot].c=i;
}
}
; i<=tot; i++)
{
if(pos[i].c==st)
; j<=; j++)
min=dij(i+j)<min?dij(i+j):min;
if(pos[i].c==st)
break;
}
printf("%.1lf",min);
tc--;
}
;
}
The End









NOIP 2001 提高组 题解的更多相关文章
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- NOIP 2000 提高组 题解
NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...
- noip 2016 提高组题解
前几天写的那个纯属搞笑.(额,好吧,其实这个也不怎么正经) 就先说说day2吧: T1:这个东西应该叫做数论吧. 然而我一看到就照着样例在纸上推了大半天(然而还是没有看出来这东西是个杨辉三角) 然后就 ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- noip 2014 提高组初赛
noip 2014 提高组初赛 一. TCP协议属于哪一层协议( ) A. 应用层 B. 传输层 C. 网络层 D. 数据链路层 B TCP(传输控制协议) 若有变量int a; float: x, ...
- [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】
/*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...
- noip2010提高组题解
NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...
- 【NOIP2018】提高组题解
[NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕
- 最优贸易 NOIP 2009 提高组 第三题
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
随机推荐
- JavaScript面向对象轻松入门之继承(demo by ES5、ES6)
继承是面向对象很重要的一个概念,分为接口继承和实现继承,接口继承即为继承某个对象的方法,实现继承即为继承某个对象的属性.JavvaScript通过原型链来实现接口继承.call()或apply()来实 ...
- 枚举:enum——初写
入门的时候,针对某一字段状态的判断,一开始是在前端用if else 判断,有一些弊端:①把内置的code暴露给用户②if else最好不要超过3层③前端很长一段冗余判断不规范后改进使用枚举,在后台进行 ...
- 在win7下如何设置计划任务每一分钟执行一次
- 10.解决VUEX刷新的时候出现数据消失
通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...
- Dagger2学习笔记
Dagger2是第一个使用生成代码的方式实现依赖注入的框架.作为Dagger的升级版本,自然有它的优势,优先注重的是执行效率.本文着重介绍Dagger2.官方据点传送门: https://google ...
- AppDelegate减负之常用三方封装 - 友盟推送篇
之前分享过集成友盟推送的方法, 需要的朋友可以查看一下链接: http://www.cnblogs.com/zhouxihi/p/6533058.html 一般开发中我们比较多使用的三方有友盟推送, ...
- 想从事IT行业的你,一定看看这篇文章
很多想从事IT行业的小伙伴都会问: 我该如何学习技术? 我应该选择什么样的方向来深入学习并以此来就业? 如何证明自己的技术很牛? 什么是程序员的核心竞争力? 如何成为一名优秀的工程师? 对于这些疑问, ...
- vijos1034题解
题目: 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲 ...
- Servlet Filter 中init和destroy问题
测试源码如下: package com.FilterTest.Filter; import java.io.IOException; import javax.servlet.Filter; impo ...
- [CF486D]有效集合-树形dp
Problem 有效集合 题目大意 给出一棵树,求出这棵树的不同联通子节点集合的数量,这些集合必须满足最大权值点减最小权值点小于等于d. Solution 再一次树d乱搞. 因为数据范围贼小,所以我们 ...