NYOJ四月份月赛总结
来源:互联网 发布:淘宝助理 未知错误 1 编辑:程序博客网 时间:2024/04/30 05:02
昨天下午的月赛【月赛地址】,做的很不理想。
总结一下跟自己的态度有很大的关系。首先,没有放平心态。刚开始G题拿到了first blood,无意中给自己增加了很大的压力。后来写CD,完全功利了,只想着一定要A掉,太心急了,以至于俩题都没A。比赛结束后,发现F是组合数学,B是矩阵模乘。泪呀。
比赛有俩水题A、G,B矩阵模乘,C是DP,D树状数组,F组合数学,H是AC自动机。
C题解题报告【这里仅记录下心得】
http://acm.nyist.net/JudgeOnline/problem.php?pid=536
题意:
看似是个矩阵连乘的题,其实是个DP。思路不太好想的一个题。
比赛的时候一直想着贪心可以解决,然后,WA了两次。信心就全无了。后来DD说是DP,当时还有半个多小时,由于心急,完全找不到子问题,最优子结构。
求1-n的最小乘法次数,必须先计算间隔小的最小乘法次数。即为最小乘法次数的最优子结构
#include<iostream>#include<stdio.h>using namespace std;int N[101];int sum[101][101];//i-j最少乘法次数#define min(a,b) (((a)<(b)))?(a):(b);int main(){int n;int i,j,k;while(scanf("%d",&n)!=EOF){for(j=0;j<=n;j++)sum[0][j]=0;for(i=1;i<=n;i++){scanf("%d%d",&N[i],&N[i+1]);for(j=0;j<=n;j++)sum[i][j]=0;}int e;for(i=1;i<n;i++)//间距【从间距为1开始遍历,直到间距为n-1】{for(j=1;j<=n-i;j++)//从第一个遍历{e=j+i;sum[j][e]=sum[j+1][e]+N[j]*N[j+1]*N[e+1];for(k=j;k<e;k++)//这里错了好久,例如,1-3的时候需要枚举1*[2.3]和[1.2]*3。必须从k=j开始计算sum[j][e]=min(sum[j][k]+sum[k+1][e]+N[j]*N[k+1]*N[e+1],sum[j][e]);}}printf("%d\n",sum[1][n]);}return 0;}
D题
一看到题的时候,就开始模拟,果断TLE。后来仔细看看,发现树状数组的插线问点。写好后还是TLE。开始的时候注意到了query(0)会造成TLE,但是后来完全忽略了,一直TLE就是没有想到是这个问题。比赛结束的前几分钟,把query(0)消除后,就AC了。果断放弃了这个题的排名,唉。。。。
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=522
#include<stdio.h>#include<cstring>#include<string>using namespace std;int m;int N[200005];int lowbit(int x){ return x&(-x);}void add(int x,int y)//改变的是一条线{for(int i=x;i>0;i-=lowbit(i)){ N[i]+=y; }}int query(int x)//要访问的是一个点{ int s=0; while(x<=200001) { s+=N[x]; x+=lowbit(x); } return s;}int main(){ int j,i,t,n,m;scanf("%d",&t); for(i=0;i<t;i++) {memset(N,0,sizeof(N));int a,b;scanf("%d%d",&n,&m); for(j=0;j<n;j++) { scanf("%d%d",&a,&b); add(a+100000,-1); add(b+100001,1); }int x; for(j=0;j<m;j++) { scanf("%d",&x); printf("%d\n",query(x+100001)); } } return 0;}
这个题有个O(n)的解法。在a-b之间添加数据,N[a-1]-=1,N[b]+=1;然后 后序遍历(N[i]+=N[i+1)一次,就是某点的N[i]值。【很好的想法!!!】
类似于士兵杀敌(五)
代码:
#include <iostream>#include <stdio.h>using namespace std;int N[1000005]={0};int main(){int n,c,q;int i;int a,b,s;scanf("%d%d%d",&n,&c,&q);for(i=0;i<c;i++){scanf("%d%d%d",&a,&b,&s);N[a-1]-=s;N[b]+=s;}for(i=n;i>=0;i--)//计算当前节点的杀敌数{N[i]+=N[i+1];}N[0]=0;for(i=1;i<=n;i++)//计算0-当前节点的杀敌总数{N[i]=(N[i]+N[i-1])%10003;}for(i=0;i<q;i++){scanf("%d%d",&a,&b);printf("%d\n",(N[b]-N[a-1]+10003)%10003);}return 0;}
- NYOJ四月份月赛总结
- 悲剧的四月份月赛
- 2013.4.25 四月份月赛解题报告
- 四月份总结
- 四月份学习总结
- 【2016】四月份英语学习总结
- 四月份总结:ACM竞赛到春假
- 2017年三月份总结和四月份计划
- NYOJ 413 月赛的悲剧
- NYOJ 月赛 448 寻找最大数
- 四月份计划
- 四月份计划
- 月赛总结
- 月赛总结1
- EOJ月赛总结
- NYOJ 422 月赛 字串和之差
- 3月-月总结
- 4月-月总结
- 示波器基础知识
- 解决Android安装文件apk下载变成zip文件
- 稀疏贝叶斯软件与手册
- 《高质量C++C编程指南》笔记
- PYGTK 的线程刷新界面的完美解决
- NYOJ四月份月赛总结
- android 通话列表
- 天龙八部源码描述
- 关于Android系统的UI线程
- nginx 指定IP或者域名进行跳转-可用做跳转维护页
- AutoCAD .NET API二次开发学习指南
- MD5检测
- MFC的文档/视图结构
- InputStream、byte[]互转