【A:HDU2032 杨辉三角】:

简单的递推,或者是基础的DP;

但是只有杨润东一个人1A,整体准确率只有8/37,具体原因不详。

经验:提交前一定要试一下比较特殊的数据或者最大的数据。其次,为了保险,一定要严格按照格式来输出。

最后,数组最好定义为全局变量,i,j等定义为局部变量。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<memory.h>
  5. #include<algorithm>
  6. using namespace std;
  7. long long f[][];
  8. int main()
  9. {
  10. int i,j,n;
  11. f[][]=;
  12. for(i=;i<=;i++)
  13. for(j=;j<=i;j++)
  14. f[i][j]=f[i-][j]+f[i-][j-];
  15. while(~scanf("%d",&n)){
  16. for(i=;i<=n;i++){
  17. printf("%lld",f[i][]);
  18. for(j=;j<=i;j++)
  19. printf(" %lld",f[i][j]);
  20. printf("\n");
  21. }
  22. printf("\n");
  23. }
  24. return ;
  25. }

【B:HDU2046 骨牌铺方格】:

我们可以得到方程F[i]=F[i-1]+F[i-2],其实就是斐波拉契数列,注意要使用long long。

经验:此题的N较小,N较大时需要用“矩阵乘法”来做。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<memory.h>
  5. #include<algorithm>
  6. #include<cmath>
  7. using namespace std;
  8. int a,b;
  9. long long s[];
  10. int main()
  11. {
  12. int n,i,j,ans,temp;
  13. s[]=;s[]=;s[]=;
  14. for(i=;i<=;i++)
  15. {
  16. s[i]=s[i-]+s[i-];
  17. }
  18. while(cin>>n){
  19. cout<<s[n]<<endl;
  20. }
  21. return ;
  22. }

-------------------------------上面的noip第一题水平,以下是noip第二题水平------------------------------------

【C:POJ2976 Dropping tests】

题意:有几门成绩,现在要求选N-K门,使得平均成绩最高,求最高平均成绩。

       思路:01分数规划:贪心+二分,我们二分最高平均成绩ans,然后排序,得到前N-K名,看他们的平均成绩是否大于等于ans。

具体实现:a/b>=ans,a-b*ans排序,越大的价值越高。证明:这里涉及一个式子:若a/b=c/d,则a/b=c/d=(a+c)/(b+d),所以分子之和/分母之和>=ans,那么a/b>=ans的程度越大越好,所以根据a-b*ans排序。

详细的证明还请自己百度。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. const double eps=1e-;
  8. int N,K;
  9. struct in
  10. {
  11. double x,y;
  12. double res;
  13. bool friend operator <(in a,in b){
  14. return a.res>b.res;
  15. }
  16. }a[];
  17. bool check(double Mid)
  18. {
  19. for(int i=;i<=N;i++) a[i].res=a[i].x-Mid*a[i].y;
  20. sort(a+,a+N+);
  21. double tx=;
  22. for(int i=;i<=K;i++) tx+=a[i].res;
  23. if(tx>=-eps) return true;
  24. return false;
  25. }
  26. int main()
  27. {
  28. while(~scanf("%d%d",&N,&K)&&(N||K)){
  29. K=N-K;
  30. for(int i=;i<=N;i++) scanf("%lf",&a[i].x),a[i].x*=100.0;
  31. for(int i=;i<=N;i++) scanf("%lf",&a[i].y);
  32. double L=,R=,Mid,ans=;
  33. while(R-L>eps){
  34. Mid=(L+R)/;
  35. if(check(Mid)) ans=Mid,L=Mid+eps;
  36. else R=Mid-eps;
  37. }
  38. printf("%.0lf\n",ans);
  39. }
  40. return ;
  41. }

【D:HihoCoder 1504 骑士游历】

基础的矩阵乘法。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn=;
  8. #define ll long long
  9. const int Mod=1e9+;
  10. int x[]={,,-,-,,,-,-};
  11. int y[]={,-,,-,,-,,-};
  12. struct mat
  13. {
  14. ll M[maxn][maxn];
  15. mat() { memset(M,,sizeof(M)); }
  16. mat friend operator *(mat a,mat b)
  17. {
  18. mat res;
  19. for(int k=;k<=;k++)
  20. for(int i=;i<=;i++)
  21. for(int j=;j<=;j++){
  22. res.M[i][j]=(res.M[i][j]+a.M[i][k]*b.M[k][j])%Mod;
  23. } return res;
  24. }
  25. mat friend operator ^(mat a,int x)
  26. {
  27. mat res; for(int i=;i<=;i++) res.M[i][i]=;
  28. while(x){
  29. if(x&) res=a*res; a=a*a; x/=;
  30. } return res;
  31. }
  32. };
  33.  
  34. mat base;
  35. void prepare()
  36. {
  37. for(int i=;i<=;i++)
  38. for(int j=;j<=;j++)
  39. for(int k=;k<;k++)
  40. if(i+x[k]>=&&i+x[k]<=&&j+y[k]>=&&j+y[k]<=)
  41. base.M[(i-)*+j][(i+x[k]-)*+j+y[k]]=;
  42. }
  43. int main()
  44. {
  45. int N,R,C,ans=;
  46. scanf("%d%d%d",&N,&R,&C);
  47. prepare();
  48. base=base^N;
  49. for(int i=;i<=;i++) ans=(ans+base.M[(R-)*+C][i])%Mod;
  50. printf("%d\n",ans);
  51. return ;
  52. }

【HDU 5890:Eighty seven】

     题意:N个物品,分别有自己的值,Q个问题,每次问拿走第X个,第Y个和第Z个物品后,是否能在里面找10个物品,使其和为87。

     思路:背包问题,DP。

经验:必须要学会使用Bitset。

  1. #include<bitset>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. using namespace std;
  8. bool ans[][][];
  9. bitset<>s[];
  10. int a[],N;
  11. int read()
  12. {
  13. char c=getchar(); int res;
  14. while(c>''||c<'') c=getchar();
  15. for(res=;c>=''&&c<='';c=getchar()) res=(res<<)+(res<<)+c-'';
  16. return res;
  17. }
  18. void solve(int x,int y,int z)
  19. {
  20. for(int i=;i<=;i++) s[i].reset();
  21. s[][]=;
  22. for(int i=;i<=N;i++){
  23. if(i==x||i==y||i==z||a[i]>) continue;
  24. for(int j=;j>=;j--) s[j]|=s[j-]<<a[i];
  25. }
  26. if(s[][]==) ans[x][y][z]=true;
  27. else ans[x][y][z]=false;
  28. }
  29. int main()
  30. {
  31. int T,Q;
  32. T=read();
  33. while(T--){
  34. scanf("%d",&N);
  35. for(int i=;i<=N;i++)
  36. a[i]=read();
  37.  
  38. for(int i=;i<=N;i++)
  39. for(int j=i;j<=N;j++)
  40. for(int k=j;k<=N;k++)
  41. solve(i,j,k);
  42.  
  43. Q=read();
  44. while(Q--){
  45. int x[];
  46. x[]=read(); x[]=read(); x[]=read();
  47. sort(x,x+);
  48. if(ans[x[]][x[]][x[]]) puts("Yes");
  49. else puts("No");
  50. }
  51. }
  52. return ;
  53. }

总结:提交前,一定要分析的东西,数据范围;算法效率是否妥当。

然后,多刷题,如果可以在HDU上面刷500题,或者BZOJ上面刷100道题,稳稳地拿省一(对弱省来说)。

当然,要学会挑战难题,突破自己。

【CQ18阶梯赛第8场】题解的更多相关文章

  1. 【CQ18阶梯赛第二场】题解

    [A-H国的身份证号码I] 用N个for语句可以搞定,但是写起来不方便,所以搜索. dfs(w,num,p)表示搜索完前w位,前面x组成的数位num,最后以为为p. 如果搜索到第N位,则表示num满足 ...

  2. 【CQ18阶梯赛第一场】题解

    [A-风格不统一如何写程序] 输入字符串,得到长度,对于每个字符:如果是大写,则改为:‘_’+小写:如果是‘_’则忽略‘_’,并且把后面的小写改为大写. #include<cstdio> ...

  3. CQ18阶梯赛第二场

    H国的身份证号码I HihoCoder - 1558 只要单纯的判断一下前后的乘积就好了, 因为不是很想处理倍数的关系, 所以我这里是用 string去处理. 代码: #include<bits ...

  4. [noi.ac省选模拟赛]第12场题解集合

    题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...

  5. [noi.ac省选模拟赛]第10场题解集合

    题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...

  6. [noi.ac省选模拟赛]第11场题解集合

    题目   比赛界面. T1   比较简单.容易想到是求鱼竿的最大独立集.由于题目的鱼竿可以被分割为二分图,就可以想到最大匹配.   尝试建边之后会发现边的数量不小,但联系题目性质会发现对于一条鱼竿,它 ...

  7. 【春训团队赛第四场】补题 | MST上倍增 | LCA | DAG上最长路 | 思维 | 素数筛 | 找规律 | 计几 | 背包 | 并查集

    春训团队赛第四场 ID A B C D E F G H I J K L M AC O O O O O O O O O 补题 ? ? O O 传送门 题目链接(CF Gym102021) 题解链接(pd ...

  8. 「NOWCODER」CSP-S模拟赛第3场

    「NOWCODER」CSP模拟赛第3场 T1 货物收集 题目 考场思路即正解 T2 货物分组 题目 考场思路 题解 60pts 算法:一维 DP 100pts 算法:一维 DP ?线段树 + 单调栈 ...

  9. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

随机推荐

  1. (10) android控件-date

    1.TimePicker <TimePicker android:id="@+id/timePicker4" android:layout_width="wrap_ ...

  2. [Bzoj5043][Lydsy1709月赛]密码破译(按位dp)

    5043: [Lydsy1709月赛]密码破译 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 477  Solved: 125[Submit][Sta ...

  3. JFinal跳转jsp页面空白

    eclipse工具中java的编译有的设置的是jre,而jsp是需要jdk来进行编译的 将这里改为jdk的就可以了

  4. PLsql/Oracle数据库中没有scott账户,如何创建并解锁

    当然首先要装好Oracle 11g 然后还要有sqlplus,这个在Oracle11g的时候应该都会配上的 进入正题,如果oracle/plsql没scott账户,如何创建 先找到Oracle安装目录 ...

  5. 【IntelliJ IDEA】2017.3.4版本永久破解

    [本版本软件包和破解jar在网盘上有    我的网盘--技术--idea破解所需要的] 1.idea官网下载 历史版本 选择2017.3.4版本下载 https://www.jetbrains.com ...

  6. android开发教程之使用线程实现视图平滑滚动示例

    最近一直想做下拉刷新的效果,琢磨了好久,才走到通过onTouch方法把整个视图往下拉的步骤,接下来就是能拉下来,松开手要能滑回去啊.网上看了好久,没有找到详细的下拉刷新的例子,只有自己慢慢琢磨了.昨天 ...

  7. ActiveMQ消息的延时和定时投递

    ActiveMQ对消息延时和定时投递做了很好的支持,其内部启动Scheduled来对该功能支持,也提供了一个封装的消息类型:org.apache.activemq.ScheduledMessage,只 ...

  8. vue - 前置工作 - 安装vsCode以及插件

    开发环境:Win7 x64 开发工具:vsCOde 开发工具vsCode插件配置:Vetur.ivue.Vue 2 Snippets Vetur:强力推荐的一款插件,为什么呢? 格式化代码.高亮.代码 ...

  9. 【转载】Http协议与TCP协议简单理解

    在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...

  10. 【转载】5种网络IO模型

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...