期望得分:100+30+60=190

实际得分:100+30+30=160

T1

最优方案跳的高度一定是单调的

所以先按高度排序

dp[i][j] 跳了i次跳到j

枚举从哪儿跳到j转移即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 51 struct node
{
int c,h;
}e[N]; int dp[N][N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} bool cmp(node p,node q)
{
return p.h<q.h;
} int main()
{
freopen("meet.in","r",stdin);
freopen("meet.out","w",stdout);
int n;
read(n);
for(int i=;i<=n;i++) read(e[i].c);
for(int i=;i<=n;i++) read(e[i].h);
sort(e+,e+n+,cmp);
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++) dp[][i]=e[i].c;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
for(int k=;k<j;k++)
dp[i][j]=min(dp[i][j],dp[i-][k]+e[j].h-e[k].h);
dp[i][j]+=e[j].c;
}
int t;
read(t);
for(int i=n;i>=;i--)
for(int j=;j<=n;j++)
if(dp[i][j]<=t) { printf("%d",i+); return ; }
}

T2

设给出的数是b1,b2,……

解为a1,a2……

那么可以得到 b1=a1+a2,b2=a1+a3

如果再知道 a2+a3=X,就可以解出a1,a2,a3

在b中把b1 b2 X 删去

剩下的最小的一定是 a1+a4,解出a4

再把a2+a4 ,a2+a4 删去,剩下的最小的一定是a1+a5

以此类推,解出所有的a

每确定一个ai
就把 aj+ai  j∈[1,i) 全删去
剩下的最小的一定是a1 和ai+1 的和

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; int n,m,tot; #define N 302 int b[N*N]; int ans[N*N][N],t[N]; bool use[N*N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void work(int x)
{
if((b[]+b[]+b[x])&) return;
t[]=b[]-b[]+b[x]>>;
t[]=b[]-t[];
t[]=b[]-t[];
memset(use,false,sizeof(use));
use[]=use[]=use[x]=true;
int r,pos;
for(int i=,k=;i<=m;++i)
{
if(use[i]) continue;
t[k]=b[i]-t[];
for(int j=;j<k;++j)
{
r=t[j]+t[k];
pos=lower_bound(b+,b+m+,r)-b;
if(b[pos]!=r) return;
while(pos<m && use[pos] && b[pos]==r) pos++;
if(b[pos]!=r) return;
use[pos]=true;
}
k++;
}
tot++;
for(int i=;i<=n;i++) ans[tot][i]=t[i];
} int main()
{
freopen("city.in","r",stdin);
freopen("city.out","w",stdout);
read(n);
m=n*(n-)/;
for(int i=;i<=m;++i) read(b[i]);
sort(b+,b+m+);
for(int i=;i<=m;++i)
{
if(i> && b[i]==b[i-]) continue;
work(i);
}
printf("%d\n",tot);
for(int i=;i<=tot;++i)
{
for(int j=;j<=n;++j) printf("%d ",ans[i][j]);
printf("\n");
}
}

T3

分块

因为街灯上的数不超过1e4,所以p最多有1e4个

用vector[i][j] 存下%i=j 的数的位置 i<=100

当p<=100 时,直接在vector[p][v] 里二分在区间[l,r]内的最左位置和最右位置

再用一个vector[i] 存下所有的街灯数位i的位置

当p>100 时,%p=v 的数 有v,v+p,v+2p……

直接枚举这些数,最多100个,在vector[i] 里 二分 在区间[l,r]内的最左位置和最右位置

#include<cstdio>
#include<vector>
#include<iostream> using namespace std; #define N 100001 int a[N]; vector<int>V1[][];
vector<int>V2[]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
freopen("light.in","r",stdin);
freopen("light.out","w",stdout);
int n,m;
read(n); read(m);
for(int i=;i<=n;++i) read(a[i]),V2[a[i]].push_back(i);
for(int i=;i<=;++i)
for(int j=;j<=n;++j)
V1[i][a[j]%i].push_back(j);
int l,r,p,v;
int L,R,MID,TMP1,TMP2;
int pos,tot;
while(m--)
{
read(l); read(r); read(p); read(v);
if(p<=)
{
L=; R=V1[p][v].size()-;
TMP1=TMP2=-;
while(L<=R)
{
MID=L+R>>;
if(V1[p][v][MID]>=l) TMP1=MID,R=MID-;
else L=MID+;
}
if(TMP1==-) { puts(""); continue; }
L=TMP1; R=V1[p][v].size()-;
while(L<=R)
{
MID=L+R>>;
if(V1[p][v][MID]<=r) TMP2=MID,L=MID+;
else R=MID-;
}
if(TMP2==-) { puts(""); continue; }
printf("%d\n",TMP2-TMP1+);
}
else
{
pos=v; tot=;
while(pos<=)
{
L=; R=V2[pos].size()-;
TMP1=TMP2=-;
while(L<=R)
{
MID=L+R>>;
if(V2[pos][MID]>=l) TMP1=MID,R=MID-;
else L=MID+;
}
if(TMP1==-) { pos+=p; continue; }
L=TMP1; R=V2[pos].size()-;
while(L<=R)
{
MID=L+R>>;
if(V2[pos][MID]<=r) TMP2=MID,L=MID+;
else R=MID-;
}
if(TMP2==-) { pos+=p; continue; }
tot+=TMP2-TMP1+;
pos+=p;
}
printf("%d\n",tot);
}
}
}

60分暴力

#include<vector>
#include<cstdio>
#include<iostream> using namespace std; #define N 100001 int n,m,a[N]; int P; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} namespace solve1
{
int l,r,p,v,ans;
void work()
{
while(m--)
{
read(l); read(r); read(p); read(v);
ans=;
for(int i=l;i<=r;i++)
if(a[i]%p==v) ans++;
printf("%d\n",ans);
} }
} namespace solve2
{
vector<int>V[];
void work()
{
int l,r,p,v;
int L,R,MID,TMP1,TMP2;
for(int o=;o<=m;o++)
{
read(l); read(r); read(p); read(v);
if(o==)
{
P=p;
for(int i=;i<=n;i++) V[a[i]%P].push_back(i);
}
if(v> || !V[v].size()) { puts(""); continue; }
L=,R=V[v].size()-; TMP1=-;
while(L<=R)
{
MID=L+R>>;
if(V[v][MID]>=l) TMP1=MID,R=MID-;
else L=MID+;
}
if(TMP1==- || V[v][TMP1]>r) { puts(""); continue; }
L=TMP1,R=V[v].size()-; TMP2=-;
while(L<=R)
{
MID=L+R>>;
if(V[v][MID]<=r) TMP2=MID,L=MID+;
else R=MID-;
}
if(TMP2==-) { puts(""); continue; }
printf("%d\n",TMP2-TMP1+);
}
}
} void init()
{
read(n); read(m);
for(int i=;i<=n;i++) read(a[i]);
if(1ll*n*m<=1e6) solve1::work();
else solve2::work();
} int main()
{
freopen("light.in","r",stdin);
freopen("light.out","w",stdout);
init();
}

2017 清北济南考前刷题Day 2 morning的更多相关文章

  1. 2017 清北济南考前刷题Day 7 afternoon

    期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...

  2. 2017 清北济南考前刷题Day 1 afternoon

    期望得分:80+30+70=180 实际得分:10+30+70=110 T1 水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水 ...

  3. 2017 清北济南考前刷题Day 3 morning

    实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...

  4. 2017 清北济南考前刷题Day 3 afternoon

    期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...

  5. 2017 清北济南考前刷题Day 4 afternoon

    期望得分:30+50+30=110 实际得分:40+0+0=40 并查集合并再次写炸... 模拟更相减损术的过程 更相减损术,差一定比被减数小,当被减数=减数时,停止 对于同一个减数来说,会被减 第1 ...

  6. 2017 清北济南考前刷题Day 7 morning

    期望得分:100+50+20=170 实际得分:10+50+20=80 1. 纸牌 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真眼可以看到所有牌朝上的一面和朝下的 ...

  7. 2017 清北济南考前刷题Day 6 afternoon

    期望得分:100+100+30=230 实际得分: 正解: 枚举最高的位,这一位m是1但实际用了0 然后剩余的低位肯定是 正数就用1,负数用0 考场思路:数位DP #include<cstdio ...

  8. 2017 清北济南考前刷题Day 6 morning

    T1 贪心 10 元先找5元 20元 先找10+5,再找3张5 #include<cstdio> using namespace std; int m5,m10,m20; int main ...

  9. 2017 清北济南考前刷题Day 5 afternoon

    期望得分:100+100+30=230 实际得分:0+0+0=30 T1 直接模拟 #include<cstdio> #include<iostream> using name ...

  10. 2017 清北济南考前刷题Day 5 morning

    期望得分:100+100+0=200 实际得分: 坐标的每一位不是0就是1,所以答案就是 C(n,k) #include<cstdio> #include<iostream> ...

随机推荐

  1. 复杂PC问题——信号量与共享存储区

    #include <stdio.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/sem.h ...

  2. 超实用 1 ArrayList 链表

    package ArrayList链表; import java.util.*; public class kk1 { /** * 作者:Mr.Fan * 功能:记住ArrayList链表 */ pu ...

  3. 团队作业8——测试与发布(Beta阶段)之展示博客

    展示博客 1. 团队成员的简介和个人博客地址,团队的源码仓库地址. a.陈福鹏 擅长技术:java.web等网站方面技术: 博客:http://www.cnblogs.com/royalchen/b. ...

  4. Struts1简单开发流程梳理

    共享数据的4种范围MVC设计模式JSP model1.JSP model2struts实现MVC机制(ActionServlet.Action)struts-config.xml ActionServ ...

  5. JS 日期 自动补齐 “2017-11-22 14:43”

    var myDate = new Date(); var myN = myDate.getFullYear(); var myY = myDate.getMonth(); var myR = myDa ...

  6. linux下 XGCOM串口助手的安装

    源码下载:http://code.google.com/p/xgcom/     也可以自己搜索下载 首先先安装依赖库,直接运行命令 #sudo apt-get install libglib2.0- ...

  7. log4j2分析总结(一)

    现在公司用log4j2 进行日志记录,我也看了相关的资料,现在进行记录学习总结下 整体结构 Appenders里设置日志的输出方式.级别和格式 Loggers里设置全局的级别和绑定appenders里 ...

  8. Jquery 中 $.getJSON的用法

    之前类似的方法用过 $.post, $.get,$.ajax,还是第一次用这个 $.getJSON. 前三个都是用作异步请求的,那么最后一个呢?其实也是异步请求的,和 $.get 最类似,因为他也是将 ...

  9. struts2针对mvc的框架 spring针对解耦与事务的框架

    struts2针对mvc的框架 spring针对解耦与事务的框架

  10. NOIP赛前集训营-提高组(第一场)#B 数数字

    题目描述 小N对于数字的大小一直都有两种看法.第一种看法是,使用字典序的大小(也就是我们常用的判断数字大小的方法,假如比较的数字长度不同,则在较短一个前面补齐前导0,再比较字典序),比如43<3 ...