T1 玩具谜题 题目传送门

这道题直接模拟就好了哇 233

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int M=1e5+;
  6. int read(){
  7. int ans=,f=,c=getchar();
  8. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  9. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  10. return ans*f;
  11. }
  12. int n,m,k,v,ans=;
  13. char s[M][];
  14. int h[M];
  15. int main()
  16. {
  17. n=read(); m=read();
  18. for(int i=;i<=n;i++) h[i]=read(),scanf("%s",s[i]);//0朝内1朝外
  19. for(int i=;i<=m;i++){
  20. k=read(); v=read();
  21. if(!k) v=-v;
  22. if(h[ans]) v=-v;
  23. ans=ans+v;
  24. if(ans<) ans=ans+n;
  25. if(ans>n) ans=ans-n;
  26. }
  27. printf("%s",s[ans]);
  28. return ;
  29. }

T2  天天爱跑步 题目传送门

这道题我 真的 看不懂..... 跳 以后填坑

T3  换教室  最短路+dp  题目传送门

这道题是道期望dp f【i】【j】【k】代表到第i个时段换了j个教师k代表当前点换不换(1换0不换) 然后就是一波递推了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int M=;
  6. const double inf=1e15;
  7. int read(){
  8. int ans=,f=,c=getchar();
  9. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  10. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  11. return ans*f;
  12. }
  13. int n,m,v,s,c[M],d[M];
  14. double k[M],f[M][M][],dis[M][M],w;
  15. void prepare(){
  16. for(int i=;i<=v;i++)
  17. for(int j=;j<=v;j++)
  18. dis[i][j]=(i==j)?:inf;
  19. for(int i=;i<=n;i++)
  20. for(int j=;j<=m;j++)
  21. f[i][j][]=f[i][j][]=inf;
  22. f[][][]=; f[][][]=;
  23. // 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]);
  24. }
  25. void floyd(){
  26. for(int k=;k<=v;k++)
  27. for(int i=;i<=v;i++)
  28. for(int j=;j<=v;j++)
  29. dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
  30. // for(int i=1;i<=v;i++,printf("\n")) for(int j=1;j<=v;j++) printf("%.2lf ",dis[i][j]);
  31. }
  32. int main()
  33. {
  34. int x,y;
  35. n=read(); m=read(); v=read(); s=read();
  36. for(int i=;i<=n;i++) c[i]=read();
  37. for(int i=;i<=n;i++) d[i]=read();
  38. for(int i=;i<=n;i++) scanf("%lf",&k[i]);
  39. prepare();
  40. for(int i=;i<=s;i++){
  41. x=read(); y=read(); scanf("%lf",&w);
  42. dis[x][y]=dis[y][x]=min(dis[x][y],w);
  43. }
  44. floyd();
  45. for(int i=;i<=n;i++){
  46. for(int j=;j<=m;j++){
  47. if(!j) {f[i][j][]=min(f[i][j][],f[i-][j][]+dis[c[i-]][c[i]]); continue;}
  48. f[i][j][]=min(f[i][j][],f[i-][j][]+dis[c[i-]][c[i]]);
  49. f[i][j][]=min(f[i][j][],f[i-][j][]+dis[d[i-]][c[i]]*k[i-]+dis[c[i-]][c[i]]*(-k[i-]));
  50. f[i][j][]=min(f[i][j][],f[i-][j-][]+dis[c[i-]][d[i]]*k[i]+dis[c[i-]][c[i]]*(-k[i]));
  51. double d1=k[i]*k[i-]*dis[d[i-]][d[i]],d2=k[i]*(-k[i-])*dis[c[i-]][d[i]];
  52. double d3=(-k[i])*k[i-]*dis[d[i-]][c[i]],d4=(-k[i])*(-k[i-])*dis[c[i-]][c[i]];
  53. f[i][j][]=min(f[i][j][],f[i-][j-][]+d1+d2+d3+d4);
  54. }
  55. }
  56. double ans=inf;
  57. for(int i=;i<=m;i++) ans=min(ans,f[n][i][]),ans=min(ans,f[n][i][]);
  58. printf("%.2lf\n",ans);
  59. return ;
  60. }

T4  组合数问题 题目传送门

这道题 搜索打一波发现是个类似杨辉三角的东西 然后就维护一波前缀和方便计算就好了哇 其实可以跑两波实现o(1) 查询 不过 我懒啦 233

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define LL long long
  5. using namespace std;
  6. const int M=;
  7. LL read(){
  8. LL ans=,f=,c=getchar();
  9. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  10. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  11. return ans*f;
  12. }
  13. LL f[M][M],sum[M][M];
  14. LL n,m,T,k,ans;
  15. void prepare(){
  16. for(LL i=;i<M;i++) f[i][]=;
  17. for(LL i=;i<M;i++)
  18. for(LL j=;j<=i;j++){
  19. f[i][j]=(f[i-][j]+f[i-][j-])%k;
  20. if(!f[i][j]) sum[i][j]=;
  21. sum[i][j]+=sum[i][j-];
  22. }
  23. }
  24. int main()
  25. {
  26. for(T=read(),k=read(),prepare();T;T--){
  27. n=read(); m=read(); ans=;
  28. for(LL i=;i<=n;i++) ans=ans+sum[i][min(i,m)];
  29. printf("%lld\n",ans);
  30. }
  31. return ;
  32. }

T5  蚯蚓 题目传送门

这道题其实就是维护三个队列q1是原队列 按从小到达sort一波 以后都不会有更新了 q2,q3分别储存砍完的前后半段 可以证明两个队列都是单调递减的 然后整体的加转化成个体的减的好了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define LL long long
  5. using namespace std;
  6. const int M=1e7+;
  7. LL read(){
  8. LL ans=,f=,c=getchar();
  9. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  10. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  11. return ans*f;
  12. }
  13. LL n,m,q,u,v,k;
  14. LL h1=,h2=,h3=,t2,t3;
  15. LL q1[M],q2[M],q3[M];
  16. bool cmp(LL a,LL b){return a>b;}
  17. LL push_max(LL x){
  18. LL sum=-0x3f3f3f3f3f3f3f3f;
  19. if(h1<=n) sum=max(sum,q1[h1]);
  20. if(h2<=t2) sum=max(sum,q2[h2]);
  21. if(h3<=t3) sum=max(sum,q3[h3]);
  22. if(h1<=n&&q1[h1]==sum) h1++;
  23. else if(h2<=t2&&q2[h2]==sum) h2++;
  24. else h3++;
  25. //printf("[%lld]\n",sum+q*(x-1));
  26. return sum+q*(x-);
  27. }
  28. int main()
  29. {
  30. n=read(); m=read(); q=read(); u=read(); v=read(); k=read();
  31. for(int i=;i<=n;i++) q1[i]=read();
  32. sort(q1+,q1++n,cmp);
  33. //for(int i=1;i<=n;i++) printf("[%d] ",q1[i]);
  34. for(LL i=;i<=m;i++){
  35. LL sum=push_max(i);
  36. if(i%k==) printf("%lld ",sum);
  37. LL now=sum*u/v;
  38. //printf("[%lld %lld]\n",now,sum-now);
  39. q2[++t2]=now-i*q; q3[++t3]=sum-now-i*q;
  40.  
  41. }printf("\n");
  42. for(LL i=;i<=n+m;i++){
  43. LL sum=push_max(m+);
  44. if(i%k==) printf("%lld ",sum);
  45. }
  46. return ;
  47. }

当然优先队列也可以打部分分 但是因为m太大了 nlog(n+m) 会T 只能拿六十分 贴一波T的代码啦

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #define LL long long
  6. using namespace std;
  7. const int M=1e7+;
  8. LL read(){
  9. LL ans=,f=,c=getchar();
  10. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  11. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  12. return ans*f;
  13. }
  14. LL x;
  15. struct node{
  16. LL w;
  17. bool operator < (const node &x)const {return w<x.w;}
  18. };
  19. priority_queue<node>qu;
  20. int n,m,q,u,v,k;
  21. int main()
  22. {
  23. n=read(); m=read(); q=read(); u=read(); v=read(); k=read();
  24. for(int i=;i<=n;i++) x=read(),qu.push((node){x});
  25. // while(!qu.empty()){node x=qu.top(); printf("%lld\n",x.w); qu.pop();}
  26. for(int i=;i<=m;i++){
  27. node x=qu.top(); qu.pop();
  28. LL sum=x.w+(i-)*q,now=sum*u/v,cur=sum-now;
  29. qu.push((node){now-i*q});
  30. qu.push((node){cur-i*q});
  31. if(i%k==) printf("%lld ",sum);
  32. }printf("\n");
  33. for(int i=;i<=n+m;i++){
  34. node x=qu.top(); qu.pop();
  35. LL sum=x.w+m*q;
  36. if(i%k==) printf("%lld ",sum);
  37. }
  38. return ;
  39. }

T6 愤怒的小鸟 题目传送门

这是一道状压dp g【i】【j】表示经过i,j两个点的二次函数一共能经过的点数

然后根据这个可以推出一波答案 不过要记得算一只鸟只打死一只猪的情况就好了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. using namespace std;
  6. const int M=;
  7. int read(){
  8. int ans=,f=,c=getchar();
  9. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  10. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  11. return ans*f;
  12. }
  13. int T,n,m;
  14. int g[M][M],f[<<M],id[M];
  15. double x[M],y[M],a,b;
  16. bool pd(double x,double y){return fabs(x-y)<1e-;}
  17. void push_ans(){
  18. n=read(); m=read();
  19. for(int i=;i<=n;i++) scanf("%lf %lf",&x[i],&y[i]);
  20. memset(g,,sizeof(g));
  21. for(int i=;i<=n;i++){
  22. for(int j=i+;j<=n;j++){
  23. if(pd(x[i],x[j])) continue;
  24. a=(y[i]/x[i]-y[j]/x[j])/(x[i]-x[j]);
  25. if(a>=) continue;
  26. b=y[i]/x[i]-a*x[i];
  27. int sum=;
  28. for(int k=;k<=n;k++) if(pd(a*x[k]+b,y[k]/x[k])) sum+=id[k];
  29. g[i][j]=sum;
  30. }
  31. }
  32. memset(f,0x3f,sizeof(f));
  33. f[]=;
  34. for(int k=;k<(<<n);k++)
  35. for(int i=;i<=n;i++){
  36. if(id[i]&k) continue;
  37. for(int j=i+;j<=n;j++) f[k|g[i][j]]=min(f[k|g[i][j]],f[k]+);
  38. f[id[i]|k]=min(f[id[i]|k],f[k]+);
  39. }
  40. printf("%d\n",f[(<<n)-]);
  41. }
  42. int main()
  43. {
  44. for(int i=;i<M;i++) id[i]=<<(i-);
  45. for(T=read();T;T--) push_ans();
  46. return ;
  47. }

noip2016 提高组的更多相关文章

  1. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  2. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  3. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  4. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  5. Noip2016提高组 组合数问题problem

    Day2 T1 题目大意 告诉你组合数公式,其中n!=1*2*3*4*5*...*n:意思是从n个物体取出m个物体的方案数 现给定n.m.k,问在所有i(1<=i<=n),所有j(1< ...

  6. 【NOIP2016提高组】 Day2 T1 组合数问题

    题目传送门:https://www.luogu.org/problemnew/show/P2822                 ↓题目大意↓ 数据的极限范围:n,m≤2000,k≤21,数据组数≤ ...

  7. NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 2.

    洛谷秋令营day1模拟赛原地爆炸,心态崩了.于是打算写一下初赛题放松一下. 上次胡乱分析到了选择题,这次我想说说后面的题. 问题求解 T1.有一个1x8的方格图形,黑白两色填涂每个方格,两个黑格并不能 ...

  8. Noip2016 提高组 蚯蚓

    刚看到这道题:这题直接用堆+模拟不就可以了(并没有认真算时间复杂度) 于是用priority_queue水到了85分-- (STL大法好) 天真的我还以为是常数问题,于是疯狂卡常--(我是ZZ) 直到 ...

  9. Noip2016 提高组 Day2 T1 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  10. BZOJ4719[NOIP2016提高组Day1T2] 天天爱跑步

    #261. [NOIP2016]天天爱跑步 描述 提交 自定义测试 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家 ...

随机推荐

  1. 台湾ML笔记--1.2 formalize the learning probelm

    Basic notations input:     x∈χ  (customer application) output:   y∈y  (good/bad after approving cred ...

  2. web开发微信文章目录

    Web开发微信文章目录 2015-12-13 Web开发 本文是Web开发微信的文章目录.通过目录查看文章编号,回复文章编号就能查看文章全文. 回复编号查看全文,搜索分类名可以获得该分类下的文章.   ...

  3. 免费天气预报API接口

    一.中国气象局(http://www.weather.com.cn) 1.实时接口 http://mobile.weather.com.cn/data/sk/101010100.html http:/ ...

  4. 虚拟现实-VR-UE4-创建一个自定义的角色 Character

    我学习的资料使用的是老版本的ue4 新版本有好多都是不一样的,好多东西需要自己来摸索, 比如,在老板版本中,默认创建一个GameMode 是回自动创建构造函数发的,而新版本,是没有的,需要自己手动填写 ...

  5. Python 3基础教程23-多维列表

    这里简单举例一个多维列表,多维看起来都很晕. # 多维列表 x = [ [5,6],[6,7],[7,2] ,[2,5] ,[4,9]] print(x) # 根据索引引用列表元素,例如打印[6,7] ...

  6. 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 ...

  7. Week1 Team Homework #1 from Z.XML-总结学长经验教训

    谭传奇学长: 我们的弯路可能是,一开始没有从最基础的部分开始迭代开发,一开始就想的太远了一些,每一步开的有点太大了,所以可能有些东西最后就连不上,也没有能够按时完成.如果可以先做出一个能用的版本,然后 ...

  8. Android之ViewPager 第一课

    想要了解Android新版本的的新特性,从头开始吧,这是Android3.0新加入的widget,以前也接触过,但是没有好好的研究过,今天写了一个小程序,研究一下ViewPager. 这个程序是支持左 ...

  9. beta版本冲刺六

    目录 组员情况 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团队签入记 ...

  10. DataGridView加载gif图片

    当我们想加载图片时,一般情况下都会使用picturebox控件,这个控件可以加载各种格式的图片,当然也包括gif图片.但是有时,我们也希望一些数据展示控件也可以加载图片,比如说DataGridView ...