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 提高组的更多相关文章

  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. java字符流实现文件间的内容复制

    package com.io.demo1; import java.io.FileReader; import java.io.FileWriter; public class TestFileSTr ...

  2. asp.net mvc 无刷新加载

    1.视图(index) <!--start--> <div data-am-widget="list_news" class="am-list-news ...

  3. Java检测端口的占用情况

    突然间想到这个问题,在网上搜了一下 http://blog.csdn.net/danieluk/article/details/18518175 网上有很多文章都是用上面那个方法来解决这个问题的,总感 ...

  4. 《python核心编程第二版》第1章练习

    1–1. 安装 Python.请检查 Python 是否已经安装到你的系统上,如果没有,请下载并 安装它 略 1–2.  执行 Python.有多少种运行 Python 的不同方法?你喜欢哪一种?为什 ...

  5. Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

    作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样, ...

  6. 安装QC的心(新)路历程 纯记录 无技术

    之前就只是看来软件测试原书第二版学习力理论知识,关于书中提到的缺陷管理工具,测试管理工具等也没有亲自去安装使用,感觉太不应该了.于是我就上网了解了一些测试管理工具后,决定先选择QC来学习.说实话,当初 ...

  7. 阿里云SLB上http强制跳转到https问题处理

    背景: 最近一客户有一个需求,需要将外网所有http访问请求强制跳转到https,公网出口使用阿里云SLB,证书放在SLB上,SLB后端实例为ECS(webserver)web服务使用nginx, 网 ...

  8. PAT——乙级1015/甲级1062:德才论

    这两个题是一模一样的 1015 德才论 (25 point(s)) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德 ...

  9. sed-awk命令详解

      第2章 ***********sed***********. 1目  录 2.1 -------sed命令小结及小结图---- 1 2.2 -------第几行---------- 2 2.3 - ...

  10. Uva 1590 IP Networks

    这道题目是一道关于IP地址的题目,要深入理解这道题需要有一定的网络基础. 这道题目我第一次做的时候虽然也AC了,但代码写的比较复杂,不够精炼.近期刚刚参加了网络方面的培训,在有一定知识的基础上,又重写 ...