【CQ18阶梯赛第8场】题解
【A:HDU2032 杨辉三角】:
简单的递推,或者是基础的DP;
但是只有杨润东一个人1A,整体准确率只有8/37,具体原因不详。
经验:提交前一定要试一下比较特殊的数据或者最大的数据。其次,为了保险,一定要严格按照格式来输出。
最后,数组最好定义为全局变量,i,j等定义为局部变量。
- #include<cstdio>
- #include<cstdlib>
- #include<iostream>
- #include<memory.h>
- #include<algorithm>
- using namespace std;
- long long f[][];
- int main()
- {
- int i,j,n;
- f[][]=;
- for(i=;i<=;i++)
- for(j=;j<=i;j++)
- f[i][j]=f[i-][j]+f[i-][j-];
- while(~scanf("%d",&n)){
- for(i=;i<=n;i++){
- printf("%lld",f[i][]);
- for(j=;j<=i;j++)
- printf(" %lld",f[i][j]);
- printf("\n");
- }
- printf("\n");
- }
- return ;
- }
【B:HDU2046 骨牌铺方格】:
我们可以得到方程F[i]=F[i-1]+F[i-2],其实就是斐波拉契数列,注意要使用long long。
经验:此题的N较小,N较大时需要用“矩阵乘法”来做。
- #include<cstdio>
- #include<cstdlib>
- #include<iostream>
- #include<memory.h>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- int a,b;
- long long s[];
- int main()
- {
- int n,i,j,ans,temp;
- s[]=;s[]=;s[]=;
- for(i=;i<=;i++)
- {
- s[i]=s[i-]+s[i-];
- }
- while(cin>>n){
- cout<<s[n]<<endl;
- }
- return ;
- }
-------------------------------上面的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排序。
详细的证明还请自己百度。
- #include<cstdio>
- #include<cstdlib>
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const double eps=1e-;
- int N,K;
- struct in
- {
- double x,y;
- double res;
- bool friend operator <(in a,in b){
- return a.res>b.res;
- }
- }a[];
- bool check(double Mid)
- {
- for(int i=;i<=N;i++) a[i].res=a[i].x-Mid*a[i].y;
- sort(a+,a+N+);
- double tx=;
- for(int i=;i<=K;i++) tx+=a[i].res;
- if(tx>=-eps) return true;
- return false;
- }
- int main()
- {
- while(~scanf("%d%d",&N,&K)&&(N||K)){
- K=N-K;
- for(int i=;i<=N;i++) scanf("%lf",&a[i].x),a[i].x*=100.0;
- for(int i=;i<=N;i++) scanf("%lf",&a[i].y);
- double L=,R=,Mid,ans=;
- while(R-L>eps){
- Mid=(L+R)/;
- if(check(Mid)) ans=Mid,L=Mid+eps;
- else R=Mid-eps;
- }
- printf("%.0lf\n",ans);
- }
- return ;
- }
【D:HihoCoder 1504 骑士游历】
基础的矩阵乘法。
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int maxn=;
- #define ll long long
- const int Mod=1e9+;
- int x[]={,,-,-,,,-,-};
- int y[]={,-,,-,,-,,-};
- struct mat
- {
- ll M[maxn][maxn];
- mat() { memset(M,,sizeof(M)); }
- mat friend operator *(mat a,mat b)
- {
- mat res;
- for(int k=;k<=;k++)
- for(int i=;i<=;i++)
- for(int j=;j<=;j++){
- res.M[i][j]=(res.M[i][j]+a.M[i][k]*b.M[k][j])%Mod;
- } return res;
- }
- mat friend operator ^(mat a,int x)
- {
- mat res; for(int i=;i<=;i++) res.M[i][i]=;
- while(x){
- if(x&) res=a*res; a=a*a; x/=;
- } return res;
- }
- };
- mat base;
- void prepare()
- {
- for(int i=;i<=;i++)
- for(int j=;j<=;j++)
- for(int k=;k<;k++)
- if(i+x[k]>=&&i+x[k]<=&&j+y[k]>=&&j+y[k]<=)
- base.M[(i-)*+j][(i+x[k]-)*+j+y[k]]=;
- }
- int main()
- {
- int N,R,C,ans=;
- scanf("%d%d%d",&N,&R,&C);
- prepare();
- base=base^N;
- for(int i=;i<=;i++) ans=(ans+base.M[(R-)*+C][i])%Mod;
- printf("%d\n",ans);
- return ;
- }
【HDU 5890:Eighty seven】
题意:N个物品,分别有自己的值,Q个问题,每次问拿走第X个,第Y个和第Z个物品后,是否能在里面找10个物品,使其和为87。
思路:背包问题,DP。
经验:必须要学会使用Bitset。
- #include<bitset>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- bool ans[][][];
- bitset<>s[];
- int a[],N;
- int read()
- {
- char c=getchar(); int res;
- while(c>''||c<'') c=getchar();
- for(res=;c>=''&&c<='';c=getchar()) res=(res<<)+(res<<)+c-'';
- return res;
- }
- void solve(int x,int y,int z)
- {
- for(int i=;i<=;i++) s[i].reset();
- s[][]=;
- for(int i=;i<=N;i++){
- if(i==x||i==y||i==z||a[i]>) continue;
- for(int j=;j>=;j--) s[j]|=s[j-]<<a[i];
- }
- if(s[][]==) ans[x][y][z]=true;
- else ans[x][y][z]=false;
- }
- int main()
- {
- int T,Q;
- T=read();
- while(T--){
- scanf("%d",&N);
- for(int i=;i<=N;i++)
- a[i]=read();
- for(int i=;i<=N;i++)
- for(int j=i;j<=N;j++)
- for(int k=j;k<=N;k++)
- solve(i,j,k);
- Q=read();
- while(Q--){
- int x[];
- x[]=read(); x[]=read(); x[]=read();
- sort(x,x+);
- if(ans[x[]][x[]][x[]]) puts("Yes");
- else puts("No");
- }
- }
- return ;
- }
总结:提交前,一定要分析的东西,数据范围;算法效率是否妥当。
然后,多刷题,如果可以在HDU上面刷500题,或者BZOJ上面刷100道题,稳稳地拿省一(对弱省来说)。
当然,要学会挑战难题,突破自己。
【CQ18阶梯赛第8场】题解的更多相关文章
- 【CQ18阶梯赛第二场】题解
[A-H国的身份证号码I] 用N个for语句可以搞定,但是写起来不方便,所以搜索. dfs(w,num,p)表示搜索完前w位,前面x组成的数位num,最后以为为p. 如果搜索到第N位,则表示num满足 ...
- 【CQ18阶梯赛第一场】题解
[A-风格不统一如何写程序] 输入字符串,得到长度,对于每个字符:如果是大写,则改为:‘_’+小写:如果是‘_’则忽略‘_’,并且把后面的小写改为大写. #include<cstdio> ...
- CQ18阶梯赛第二场
H国的身份证号码I HihoCoder - 1558 只要单纯的判断一下前后的乘积就好了, 因为不是很想处理倍数的关系, 所以我这里是用 string去处理. 代码: #include<bits ...
- [noi.ac省选模拟赛]第12场题解集合
题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...
- [noi.ac省选模拟赛]第10场题解集合
题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...
- [noi.ac省选模拟赛]第11场题解集合
题目 比赛界面. T1 比较简单.容易想到是求鱼竿的最大独立集.由于题目的鱼竿可以被分割为二分图,就可以想到最大匹配. 尝试建边之后会发现边的数量不小,但联系题目性质会发现对于一条鱼竿,它 ...
- 【春训团队赛第四场】补题 | 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 ...
- 「NOWCODER」CSP-S模拟赛第3场
「NOWCODER」CSP模拟赛第3场 T1 货物收集 题目 考场思路即正解 T2 货物分组 题目 考场思路 题解 60pts 算法:一维 DP 100pts 算法:一维 DP ?线段树 + 单调栈 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
随机推荐
- (10) android控件-date
1.TimePicker <TimePicker android:id="@+id/timePicker4" android:layout_width="wrap_ ...
- [Bzoj5043][Lydsy1709月赛]密码破译(按位dp)
5043: [Lydsy1709月赛]密码破译 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 477 Solved: 125[Submit][Sta ...
- JFinal跳转jsp页面空白
eclipse工具中java的编译有的设置的是jre,而jsp是需要jdk来进行编译的 将这里改为jdk的就可以了
- PLsql/Oracle数据库中没有scott账户,如何创建并解锁
当然首先要装好Oracle 11g 然后还要有sqlplus,这个在Oracle11g的时候应该都会配上的 进入正题,如果oracle/plsql没scott账户,如何创建 先找到Oracle安装目录 ...
- 【IntelliJ IDEA】2017.3.4版本永久破解
[本版本软件包和破解jar在网盘上有 我的网盘--技术--idea破解所需要的] 1.idea官网下载 历史版本 选择2017.3.4版本下载 https://www.jetbrains.com ...
- android开发教程之使用线程实现视图平滑滚动示例
最近一直想做下拉刷新的效果,琢磨了好久,才走到通过onTouch方法把整个视图往下拉的步骤,接下来就是能拉下来,松开手要能滑回去啊.网上看了好久,没有找到详细的下拉刷新的例子,只有自己慢慢琢磨了.昨天 ...
- ActiveMQ消息的延时和定时投递
ActiveMQ对消息延时和定时投递做了很好的支持,其内部启动Scheduled来对该功能支持,也提供了一个封装的消息类型:org.apache.activemq.ScheduledMessage,只 ...
- vue - 前置工作 - 安装vsCode以及插件
开发环境:Win7 x64 开发工具:vsCOde 开发工具vsCode插件配置:Vetur.ivue.Vue 2 Snippets Vetur:强力推荐的一款插件,为什么呢? 格式化代码.高亮.代码 ...
- 【转载】Http协议与TCP协议简单理解
在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...
- 【转载】5种网络IO模型
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...