noip2016 提高组
T1 玩具谜题 题目传送门
这道题直接模拟就好了哇 233
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int M=1e5+;
- int read(){
- int ans=,f=,c=getchar();
- while(c<''||c>''){if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
- return ans*f;
- }
- int n,m,k,v,ans=;
- char s[M][];
- int h[M];
- int main()
- {
- n=read(); m=read();
- for(int i=;i<=n;i++) h[i]=read(),scanf("%s",s[i]);//0朝内1朝外
- for(int i=;i<=m;i++){
- k=read(); v=read();
- if(!k) v=-v;
- if(h[ans]) v=-v;
- ans=ans+v;
- if(ans<) ans=ans+n;
- if(ans>n) ans=ans-n;
- }
- printf("%s",s[ans]);
- return ;
- }
T2 天天爱跑步 题目传送门
这道题我 真的 看不懂..... 跳 以后填坑
T3 换教室 最短路+dp 题目传送门
这道题是道期望dp f【i】【j】【k】代表到第i个时段换了j个教师k代表当前点换不换(1换0不换) 然后就是一波递推了
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int M=;
- const double inf=1e15;
- int read(){
- int ans=,f=,c=getchar();
- while(c<''||c>''){if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
- return ans*f;
- }
- int n,m,v,s,c[M],d[M];
- double k[M],f[M][M][],dis[M][M],w;
- void prepare(){
- for(int i=;i<=v;i++)
- for(int j=;j<=v;j++)
- dis[i][j]=(i==j)?:inf;
- for(int i=;i<=n;i++)
- for(int j=;j<=m;j++)
- f[i][j][]=f[i][j][]=inf;
- f[][][]=; f[][][]=;
- // for(int i=1;i<=n;i++,printf("\n")) for(int j=1;j<=v;j++) printf("[%.2lf %.2lf] ",f[i][j][0],f[i][j][1]);
- }
- void floyd(){
- for(int k=;k<=v;k++)
- for(int i=;i<=v;i++)
- for(int j=;j<=v;j++)
- dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
- // for(int i=1;i<=v;i++,printf("\n")) for(int j=1;j<=v;j++) printf("%.2lf ",dis[i][j]);
- }
- int main()
- {
- int x,y;
- n=read(); m=read(); v=read(); s=read();
- for(int i=;i<=n;i++) c[i]=read();
- for(int i=;i<=n;i++) d[i]=read();
- for(int i=;i<=n;i++) scanf("%lf",&k[i]);
- prepare();
- for(int i=;i<=s;i++){
- x=read(); y=read(); scanf("%lf",&w);
- dis[x][y]=dis[y][x]=min(dis[x][y],w);
- }
- floyd();
- for(int i=;i<=n;i++){
- for(int j=;j<=m;j++){
- if(!j) {f[i][j][]=min(f[i][j][],f[i-][j][]+dis[c[i-]][c[i]]); continue;}
- f[i][j][]=min(f[i][j][],f[i-][j][]+dis[c[i-]][c[i]]);
- f[i][j][]=min(f[i][j][],f[i-][j][]+dis[d[i-]][c[i]]*k[i-]+dis[c[i-]][c[i]]*(-k[i-]));
- f[i][j][]=min(f[i][j][],f[i-][j-][]+dis[c[i-]][d[i]]*k[i]+dis[c[i-]][c[i]]*(-k[i]));
- double d1=k[i]*k[i-]*dis[d[i-]][d[i]],d2=k[i]*(-k[i-])*dis[c[i-]][d[i]];
- double d3=(-k[i])*k[i-]*dis[d[i-]][c[i]],d4=(-k[i])*(-k[i-])*dis[c[i-]][c[i]];
- f[i][j][]=min(f[i][j][],f[i-][j-][]+d1+d2+d3+d4);
- }
- }
- double ans=inf;
- for(int i=;i<=m;i++) ans=min(ans,f[n][i][]),ans=min(ans,f[n][i][]);
- printf("%.2lf\n",ans);
- return ;
- }
T4 组合数问题 题目传送门
这道题 搜索打一波发现是个类似杨辉三角的东西 然后就维护一波前缀和方便计算就好了哇 其实可以跑两波实现o(1) 查询 不过 我懒啦 233
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define LL long long
- using namespace std;
- const int M=;
- LL read(){
- LL ans=,f=,c=getchar();
- while(c<''||c>''){if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
- return ans*f;
- }
- LL f[M][M],sum[M][M];
- LL n,m,T,k,ans;
- void prepare(){
- for(LL i=;i<M;i++) f[i][]=;
- for(LL i=;i<M;i++)
- for(LL j=;j<=i;j++){
- f[i][j]=(f[i-][j]+f[i-][j-])%k;
- if(!f[i][j]) sum[i][j]=;
- sum[i][j]+=sum[i][j-];
- }
- }
- int main()
- {
- for(T=read(),k=read(),prepare();T;T--){
- n=read(); m=read(); ans=;
- for(LL i=;i<=n;i++) ans=ans+sum[i][min(i,m)];
- printf("%lld\n",ans);
- }
- return ;
- }
T5 蚯蚓 题目传送门
这道题其实就是维护三个队列q1是原队列 按从小到达sort一波 以后都不会有更新了 q2,q3分别储存砍完的前后半段 可以证明两个队列都是单调递减的 然后整体的加转化成个体的减的好了
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define LL long long
- using namespace std;
- const int M=1e7+;
- LL read(){
- LL ans=,f=,c=getchar();
- while(c<''||c>''){if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
- return ans*f;
- }
- LL n,m,q,u,v,k;
- LL h1=,h2=,h3=,t2,t3;
- LL q1[M],q2[M],q3[M];
- bool cmp(LL a,LL b){return a>b;}
- LL push_max(LL x){
- LL sum=-0x3f3f3f3f3f3f3f3f;
- if(h1<=n) sum=max(sum,q1[h1]);
- if(h2<=t2) sum=max(sum,q2[h2]);
- if(h3<=t3) sum=max(sum,q3[h3]);
- if(h1<=n&&q1[h1]==sum) h1++;
- else if(h2<=t2&&q2[h2]==sum) h2++;
- else h3++;
- //printf("[%lld]\n",sum+q*(x-1));
- return sum+q*(x-);
- }
- int main()
- {
- n=read(); m=read(); q=read(); u=read(); v=read(); k=read();
- for(int i=;i<=n;i++) q1[i]=read();
- sort(q1+,q1++n,cmp);
- //for(int i=1;i<=n;i++) printf("[%d] ",q1[i]);
- for(LL i=;i<=m;i++){
- LL sum=push_max(i);
- if(i%k==) printf("%lld ",sum);
- LL now=sum*u/v;
- //printf("[%lld %lld]\n",now,sum-now);
- q2[++t2]=now-i*q; q3[++t3]=sum-now-i*q;
- }printf("\n");
- for(LL i=;i<=n+m;i++){
- LL sum=push_max(m+);
- if(i%k==) printf("%lld ",sum);
- }
- return ;
- }
当然优先队列也可以打部分分 但是因为m太大了 nlog(n+m) 会T 只能拿六十分 贴一波T的代码啦
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #define LL long long
- using namespace std;
- const int M=1e7+;
- LL read(){
- LL ans=,f=,c=getchar();
- while(c<''||c>''){if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
- return ans*f;
- }
- LL x;
- struct node{
- LL w;
- bool operator < (const node &x)const {return w<x.w;}
- };
- priority_queue<node>qu;
- int n,m,q,u,v,k;
- int main()
- {
- n=read(); m=read(); q=read(); u=read(); v=read(); k=read();
- for(int i=;i<=n;i++) x=read(),qu.push((node){x});
- // while(!qu.empty()){node x=qu.top(); printf("%lld\n",x.w); qu.pop();}
- for(int i=;i<=m;i++){
- node x=qu.top(); qu.pop();
- LL sum=x.w+(i-)*q,now=sum*u/v,cur=sum-now;
- qu.push((node){now-i*q});
- qu.push((node){cur-i*q});
- if(i%k==) printf("%lld ",sum);
- }printf("\n");
- for(int i=;i<=n+m;i++){
- node x=qu.top(); qu.pop();
- LL sum=x.w+m*q;
- if(i%k==) printf("%lld ",sum);
- }
- return ;
- }
T6 愤怒的小鸟 题目传送门
这是一道状压dp g【i】【j】表示经过i,j两个点的二次函数一共能经过的点数
然后根据这个可以推出一波答案 不过要记得算一只鸟只打死一只猪的情况就好了
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- const int M=;
- int read(){
- int ans=,f=,c=getchar();
- while(c<''||c>''){if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
- return ans*f;
- }
- int T,n,m;
- int g[M][M],f[<<M],id[M];
- double x[M],y[M],a,b;
- bool pd(double x,double y){return fabs(x-y)<1e-;}
- void push_ans(){
- n=read(); m=read();
- for(int i=;i<=n;i++) scanf("%lf %lf",&x[i],&y[i]);
- memset(g,,sizeof(g));
- for(int i=;i<=n;i++){
- for(int j=i+;j<=n;j++){
- if(pd(x[i],x[j])) continue;
- a=(y[i]/x[i]-y[j]/x[j])/(x[i]-x[j]);
- if(a>=) continue;
- b=y[i]/x[i]-a*x[i];
- int sum=;
- for(int k=;k<=n;k++) if(pd(a*x[k]+b,y[k]/x[k])) sum+=id[k];
- g[i][j]=sum;
- }
- }
- memset(f,0x3f,sizeof(f));
- f[]=;
- for(int k=;k<(<<n);k++)
- for(int i=;i<=n;i++){
- if(id[i]&k) continue;
- for(int j=i+;j<=n;j++) f[k|g[i][j]]=min(f[k|g[i][j]],f[k]+);
- f[id[i]|k]=min(f[id[i]|k],f[k]+);
- }
- printf("%d\n",f[(<<n)-]);
- }
- int main()
- {
- for(int i=;i<M;i++) id[i]=<<(i-);
- for(T=read();T;T--) push_ans();
- return ;
- }
noip2016 提高组的更多相关文章
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- 【题解】NOIP2016提高组 复赛
[题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...
- 【题解】NOIP2016 提高组 简要题解
[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...
- [日记&做题记录]-Noip2016提高组复赛 倒数十天
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...
- Noip2016提高组 组合数问题problem
Day2 T1 题目大意 告诉你组合数公式,其中n!=1*2*3*4*5*...*n:意思是从n个物体取出m个物体的方案数 现给定n.m.k,问在所有i(1<=i<=n),所有j(1< ...
- 【NOIP2016提高组】 Day2 T1 组合数问题
题目传送门:https://www.luogu.org/problemnew/show/P2822 ↓题目大意↓ 数据的极限范围:n,m≤2000,k≤21,数据组数≤ ...
- NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.
洛谷秋令营day1模拟赛原地爆炸,心态崩了.于是打算写一下初赛题放松一下. 上次胡乱分析到了选择题,这次我想说说后面的题. 问题求解 T1.有一个1x8的方格图形,黑白两色填涂每个方格,两个黑格并不能 ...
- Noip2016 提高组 蚯蚓
刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到 ...
- Noip2016 提高组 Day2 T1 组合数问题
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- BZOJ4719[NOIP2016提高组Day1T2] 天天爱跑步
#261. [NOIP2016]天天爱跑步 描述 提交 自定义测试 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家 ...
随机推荐
- 台湾ML笔记--1.2 formalize the learning probelm
Basic notations input: x∈χ (customer application) output: y∈y (good/bad after approving cred ...
- web开发微信文章目录
Web开发微信文章目录 2015-12-13 Web开发 本文是Web开发微信的文章目录.通过目录查看文章编号,回复文章编号就能查看文章全文. 回复编号查看全文,搜索分类名可以获得该分类下的文章. ...
- 免费天气预报API接口
一.中国气象局(http://www.weather.com.cn) 1.实时接口 http://mobile.weather.com.cn/data/sk/101010100.html http:/ ...
- 虚拟现实-VR-UE4-创建一个自定义的角色 Character
我学习的资料使用的是老版本的ue4 新版本有好多都是不一样的,好多东西需要自己来摸索, 比如,在老板版本中,默认创建一个GameMode 是回自动创建构造函数发的,而新版本,是没有的,需要自己手动填写 ...
- Python 3基础教程23-多维列表
这里简单举例一个多维列表,多维看起来都很晕. # 多维列表 x = [ [5,6],[6,7],[7,2] ,[2,5] ,[4,9]] print(x) # 根据索引引用列表元素,例如打印[6,7] ...
- DFS(8)——poj2034Anti-prime Sequences
一.题目回顾 题目链接:Anti-prime Sequences Sample Input 1 10 2 1 10 3 1 10 5 40 60 7 0 0 0 Sample Output 1,3 ...
- Week1 Team Homework #1 from Z.XML-总结学长经验教训
谭传奇学长: 我们的弯路可能是,一开始没有从最基础的部分开始迭代开发,一开始就想的太远了一些,每一步开的有点太大了,所以可能有些东西最后就连不上,也没有能够按时完成.如果可以先做出一个能用的版本,然后 ...
- Android之ViewPager 第一课
想要了解Android新版本的的新特性,从头开始吧,这是Android3.0新加入的widget,以前也接触过,但是没有好好的研究过,今天写了一个小程序,研究一下ViewPager. 这个程序是支持左 ...
- beta版本冲刺六
目录 组员情况 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团队签入记 ...
- DataGridView加载gif图片
当我们想加载图片时,一般情况下都会使用picturebox控件,这个控件可以加载各种格式的图片,当然也包括gif图片.但是有时,我们也希望一些数据展示控件也可以加载图片,比如说DataGridView ...