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. 【JDK配置原创】JDK(JRE)环境变量配置原理 --费元星

    已经配置了很多次jdk了,每次都是安装网上的教程配的,今天突然想了解了解原理了,整理一下! 参考贴( http://blog.csdn.net/wkupaochuan/article/details/ ...

  2. 从装机到配置-CentOS6.5

    L006课程结束后的总结 首先:系统(cat /etc/redhat-release):CentOS release 6.5 (Final) 版本(uname -r):2.6.32-431.el6.x ...

  3. Qt Qwdget 汽车仪表知识点拆解8 淡入效果

    先贴上效果图,注意,没有写逻辑,都是乱动的 看下面的开始,开始的时候有一个带入的效果,这里有一个坑, 网上大部分都是调用下面这个函数 setWindowOpacity(); 但是,你会发现,在你的子窗 ...

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

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

  5. SQL的鸡肋:“视图”

        不知道当年SQL定义者们设计视图时是出于什么样的考虑.实际效果是,视图夹在SQL指令和表之间,形成了一个三明治的结构.在这种结构下做检索,SQL指令每次都要通过视图转换,才能作用到表上.如果不 ...

  6. 数据挖掘算法:k-means算法的C++实现

    (期末考试要到了,所以比较粗糙,请各位读者理解..) 一.    概念 k-means是基于原型的.划分的聚类技术.它试图发现用户指定个数(K)的簇(由质心代表).K-means算法接受输入量K,然后 ...

  7. swarm 服务器安装

    apt install docker.io-----------------------配置加速器.私有仓库地址---------------------mkdir -p /etc/dockertee ...

  8. [leetcode-635-Design Log Storage System]

    You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...

  9. Activiti工作流(三)——流程变量

    流程变量可以是流程中一系列参数,比如办理人(Assignee),消息(message)等.这些流程变量使得activiti能够应用于更为复杂的业务中,使得流程变得更加灵活可控. 场景(一) 图一:没有 ...

  10. delphi RGB与TColor的转换

    1.RGB转换为Tcolor function RGBToColor(R,G,B: byte): Tcolor;begin  Result := B Shl 16 or G  shl 8 or R;e ...