NOIP 2001 提高组 题解

No 1. 一元三次方程求解

https://vijos.org/p/1116

看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~

数据小 暴力枚举即可

 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. 数的划分

https://vijos.org/p/1117

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. 统计单词个数

https://vijos.org/p/1118

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的旅行路线

https://vijos.org/p/1119

简单的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 提高组 题解的更多相关文章

  1. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  2. NOIP 2000 提高组 题解

    NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...

  3. noip 2016 提高组题解

    前几天写的那个纯属搞笑.(额,好吧,其实这个也不怎么正经) 就先说说day2吧: T1:这个东西应该叫做数论吧. 然而我一看到就照着样例在纸上推了大半天(然而还是没有看出来这东西是个杨辉三角) 然后就 ...

  4. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  5. noip 2014 提高组初赛

    noip 2014 提高组初赛 一. TCP协议属于哪一层协议( ) A. 应用层 B. 传输层 C. 网络层 D. 数据链路层 B TCP(传输控制协议) 若有变量int a; float: x, ...

  6. [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】

    /*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...

  7. noip2010提高组题解

    NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...

  8. 【NOIP2018】提高组题解

    [NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕

  9. 最优贸易 NOIP 2009 提高组 第三题

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...

随机推荐

  1. css实现选项卡

    <style> *{ margin: ; padding: ; text-decoration: none; list-style: none; outline:none; } .box{ ...

  2. 基于node.js制作爬虫教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...

  3. Swift字符串插值

    字符串插值是一种全新的构建字符串的方式,可以在其中包含常量.变量.字面量和表达式.您插入的字符串字面量的每一项都被包裹在以反斜线为前缀的圆括号中: let multiplier = let messa ...

  4. [leetcode-496-Next Greater Element I]

    You are given two arrays (without duplicates) nums1 and nums2 where nums1's elements are subset of n ...

  5. 一个"2-SUM"问题

    题目要求: Download the text file here. (Right click and save link as). The goal of this problem is to im ...

  6. JAVA基础——编程练习(一)

    java编程练习(一) 编程题目: 请根据所学知识,编写一个 JAVA 程序,实现输出考试成绩的前三名. 要求: 1. 考试成绩已保存在数组 scores 中,数组元素依次为 89 , -23 , 6 ...

  7. Python爬虫学习之爬美女图片

    最近看机器学习挺火的,然后,想要借助业余时间,来学习Python,希望能为来年找一份比较好的工作. 首先,学习得要有动力,动力,从哪里来呢?肯定是从日常需求之中来.我学Python看网上介绍.能通过P ...

  8. VB6之HOOK技术

    代码背景,自身程序的窗口上有一个TextBox,Hook住WH_CALLWNDPROC用来截获EN_CHNAGE即文本变更的消息. *这个其实用SetWindowLong和CallWindowProc ...

  9. TortoiseGit上传项目到github方法(超简单)

    Github是咱广大开发者用的非常多的项目版本管理网站,项目托管可以是私人的(private)或者公开的(public),私人的收费,一个月7美金.咱这里就只说我们个人使用的,一般都是代码对外开放的: ...

  10. easyui点击搜索的时候获取不要文本框里面的值的问题

    jsp的代码 <div id="tb"> <input id="AppID" placeholder="请根据申请人ID搜索&quo ...