2017-10-29-morning-清北模拟赛

T1 遭遇



#include <algorithm>
#include <cstdio>
#include <cmath> inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int T(1e7+);
const int N();
int n,t,ans;
struct Node {
int h,c;
}a[N]; bool cmp1(Node a,Node b)
{
return a.h<b.h;
}
bool cmp2(Node a,Node b)
{
return a.c<b.c;
} bool fc,fh;
inline void Judge()
{
if(a[].c) fc=;
int pre=a[].h;
for(int i=; i<=n; ++i)
{
if(a[i].c) fc=;
if(pre!=a[i].h) fh=;
if(fc&&fh) return ;
}
} inline void work1()
{
std::sort(a+,a+n+,cmp1);
int pre=a[].h;ans++;
for(int i=; i<=n&&t>=abs(a[i].h-pre); )
ans++,t-=abs(a[i].h-pre),pre=a[i++].h;
printf("%d\n",ans);
}
inline void work2()
{
std::sort(a+,a+n+,cmp2);
for(int i=; i<=n&&t>=a[i].c; ++i)
++ans,t-=a[i].c;
printf("%d\n",ans);
} bool vis[N];
void DFS(int now,int cnt,int tt)
{
ans=ans>cnt?ans:cnt;
if(cnt==n+) return ;
for(int i=; i<=n; ++i)
{
if(vis[i]) continue;
if(tt+abs(a[i].h-a[now].h)+a[i].c>t) continue;
vis[i]=;
DFS(i,cnt+,tt+abs(a[i].h-a[now].h)+a[i].c);
vis[i]=;
}
}
inline void work3()
{
for(int i=; i<=n; ++i)
vis[i]=,DFS(i,,a[i].c),vis[i]=;
printf("%d\n",ans);
} int Presist()
{
freopen("meet.in","r",stdin);
freopen("meet.out","w",stdout);
// freopen("1.txt","r",stdin);
read(n);
for(int i=; i<=n; ++i) read(a[i].c);
for(int i=; i<=n; ++i) read(a[i].h);
Judge();read(t);
if(!fc) { work1(); return ; }
if(!fh) { work2(); return ; }
work3();
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
50分暴力
贪心:以c为第一关键字,枚举跳楼的集合,可以发现对于一个集合里的楼房,高度的消耗为hmax-hmin(可以发现,从最高向最低或从最低向最高调最优,那么sum=h1-h2+h2-h3+h3-h4,设h1=hmax,h4=min),确定集合的最高最低楼房,n^3枚举
#include <algorithm>
#include <cstdio>
#include <cmath> #define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b) inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int T(1e7+);
const int N();
int n,t,ans;
struct Node {
int h,c;
bool operator < (const Node&x)const
{
return c<x.c;
}
}a[N]; int Presist()
{
freopen("meet.in","r",stdin);
freopen("meet.out","w",stdout);
// freopen("1.txt","r",stdin);
read(n);
for(int i=; i<=n; ++i) read(a[i].c);
for(int i=; i<=n; ++i) read(a[i].h);
read(t); std::sort(a+,a+n+);
for(int l=; l<=n; ++l)
for(int r=l+; r<=n; ++r)
{
int tot=t,tmp;
int max_=max(a[l].h,a[r].h);
int min_=min(a[l].h,a[r].h);
tot-=(max_-min_+a[l].c+a[r].c);
if(tot<) continue; tmp=;
for(int i=; i<=n; ++i)
{
if(i==l||a[i].h>max_) continue;
if(i==r||a[i].h<min_) continue;
if(tot-a[i].c<) continue;
tot-=a[i].c,tmp++;
}
ans=max(ans,tmp);
}
if(ans==&&a[].c<=t) ans=;
printf("%d\n",ans);
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
DP: f[i][j]表示跳了i座楼房,现在在j号的最小花费,以h为第一关键字,确定当前楼房j,枚举下一个楼房,
在满足话费小于t的情况下,更新ans
#include <algorithm>
#include <cstdio> const int N = ; struct Building
{
int h, c;
bool operator<(const Building &x)const
{
return h < x.h;
}
}B[N];
int n,f[N][N];
int main()
{
freopen("meet.in", "r", stdin);
freopen("meet.out", "w", stdout);
scanf("%d",&n);
for(int i=; i<n; ++i)
scanf("%d", &B[i].c);
for(int i=; i<n; ++i)
scanf("%d",&B[i].h);
int T;scanf("%d",&T);
std::sort(B,B+n);
int ans=;
for(int i=; i<n; ++i)
if((f[][i]=B[i].c)<=T) ans = ;
for(int i=; i<=n; ++i)
for(int j=, minv = T + ; j < n; ++j)
{
if((f[i][j]=minv+B[j].h+B[j].c)<=T) ans=i;
minv=std::min(minv,f[i-][j]-B[j].h);
}
printf("%d\n",ans);
return ;
}
AC
T2 都市



设b1,b2,……,bn为一组答案,那么给出的n*(n-1)/2个数中,最小的一定等于b1+b2,
次小的一定等于b1+b3,为了确定b1 b2 b3我们还需要b2+b3的值。
由于b1+b4可能小于b2+b3,所以我们不能确定b2+b3的值,那么由于数据范围挺小的,枚举b2+b3是n*(n-1)/2中的哪一个就好了。
确定了b2+b3之后我们发现b1 b2 b3的值就都有了,然后b1+b4一定是剩下中最小的,依次类推一个一个解出剩下的数就搞定了。
#include <algorithm>
#include <cstdio> inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int M(1e8+);
const int N();
int now,t,it,vis[N*N];
int n,m,a[N*N],b[N];
int ans[N][N],cnt;
bool flag; int Presist()
{
freopen("city.in","r",stdin);
freopen("city.out","w",stdout);
read(n),m=n*(n-)>>;
for(int i=; i<=m; ++i) read(a[i]);
std:: sort(a+,a+m+);
for(int i=; i<=n&&a[i]<a[]+a[]; ++i)
{
if((a[]+a[]-a[i])&) continue;
if(i>&&a[i] ==a[i-]) continue;
b[]=a[]+a[]-a[i]>>;
b[]=a[]-b[], b[]=a[]-b[];
vis[]=vis[]=vis[i]=i;
flag=; now=;
for(int j=; j<=n; ++j)
{
for(; vis[now]==i; ) now++;
b[j]=a[now]-b[];
for(int t,k=; k<j; ++k)
{
t=b[j]+b[k];
it=std::lower_bound(a+,a+m+,t)-a;
for(; a[it]==t&&vis[it]==i; ) it++;
if(a[it]!=t) { flag=; break; }
vis[it]=i;
}
if(!flag) break;
}
if(!flag) continue; cnt++;
for(int j=; j<=n; ++j) ans[cnt][j]=b[j];
}
printf("%d\n",cnt);
for(int i=; i<=cnt; ++i)
{
for(int j=; j<n; ++j)
printf("%d ",ans[i][j]);
printf("%d\n",ans[i][n]);
}
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
T3 街灯


做法的核心思想是按p的大小分不同的做法,首先注意到p>10000是没有什么意义的,所以我们按照sqrt(10000)=100进行分块来做。
对于p<=100的,我们发现对于p<=100,总共的可能的询问也就只有100*(100-1)/2=4950种(p,v)的取值,所以我们可以预处理这一部分。
我们枚举一个p和一个v,对一个(p,v)开一个vector,将所有模p等于v的数全部放到这个vector里面来,那么每次询问的时候,只需要直接在这个vector里面二分区间内有多少个在这个vector里面即可。
对于p>100的,情况就比较多了没法预处理了,但是注意到可能被统计到答案里面的数,只有v,p+v,2p+v…………之类的数,这样可能的数只有sqrt(n)个,所以我们提前对每一个v开一个vector,把所有等于v的数全部放到这个vector里面。之后每一次询问的时候,我们去v,p+v,2p+v……这每一个vector里面二分即可。
这样总的复杂度就是O(nlognsqrt(n))了,就可以过了。vector常数比较大,也可以直接用数组或者链表实现。
#include <algorithm>
#include <cstdio>
#include <vector> using namespace std; inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int N(1e5+);
const int V(); vector<int>vc1[][],vc2[N]; int a[N]; int Presist()
{
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]),vc2[a[i]].push_back(i);
for(int i=; i<=; ++i)
for(int j=; j<=n; ++j)
vc1[i][a[j]%i].push_back(j);
int L,R,L_,R_,Mid,ans;
for(int l,r,v,p; m--; )
{
read(l),read(r),read(p),read(v);
if(p<=)
{
L=, R=vc1[p][v].size()-;
for(L_=-; L<=R; )
{
Mid=L+R>>;
if(vc1[p][v][Mid]>=l)
R=Mid-,L_=Mid;
else L=Mid+;
}
if(L_==-) { puts(""); continue; } L=L_, R=vc1[p][v].size()-;
for(R_=-; L<=R; )
{
Mid=L+R>>;
if(vc1[p][v][Mid]<=r)
L=Mid+, R_=Mid;
else R=Mid-;
}
if(R_==-) { puts(""); continue; }
printf("%d\n",R_-L_+);
}
else
{
ans=;
for(int i=v; i<=V; i+=p)
{
vector<int>::iterator l_=lower_bound(vc2[i].begin(),vc2[i].end(),l);
vector<int>::iterator r_=upper_bound(vc2[i].begin(),vc2[i].end(),r);
ans+=r_-l_;
}
printf("%d\n",ans);
}
}
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}
AC
2017-10-29-morning-清北模拟赛的更多相关文章
- 2017.10.1 国庆清北 D1T1 zhx的字符串题
题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...
- 2017.10.3北京清北综合强化班DAY3
括号序列(bracket) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的 ...
- 2017.10.4北京清北综合强化班DAY4
财富(treasure) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以 ...
- 2017.10.7北京清北综合强化班DAY7
1.计数 (count.cpp/c/pas) 时间限制:1s 内存限制:256MB [问题描述] 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍 ...
- 2017.10.6北京清北综合强化班DAY6
题目大意:改变一个数的位置 把一个序列变成不下降序列 题解: 设置一个pre,如果破坏单调性,就把‘删除’这个.否则把pre修改为当前元素的值. 考试时这样得了90分,是因为我的做法只能过这样的数据 ...
- 2017.10.5北京清北综合强化班DAY5
拼不出的数lost.in/.out/.cpp[问题描述]3 个元素的集合{5, 1,2} 的所有子集的和分别是0,1, 2, 3, 5, 6, 7, 8.发现最小的不能由该集合子集拼出的数字是4.现在 ...
- 2017.10.1北京清北综合强化班DAY1
a[问题描述]你是能看到第一题的 friends 呢.——hja何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx. 何大爷今天为字符串定义了新的权值计算方法.一个字符串 由小写字母组成,字符串 ...
- 2017.10.4 国庆清北 D4T2 正方形
题目描述 在一个10000*10000的二维平面上,有n颗糖果. LYK喜欢吃糖果!并且它给自己立了规定,一定要吃其中的至少C颗糖果! 事与愿违,LYK只被允许圈出一个正方形,它只能吃在正方形里面的糖 ...
- 2017.10.6 国庆清北 D6T2 同余方程组
题目描述 求关于x 的同余方程组 x%a1 = b1 x%a2 = b2 x%a3 = b3 x%a4 = b4 的大于等于0 的最小整数解. 输入输出格式 输入格式: 一行8 个整数,表示a1; b ...
- 2017.10.6 国庆清北 D6T1 排序
题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. 比如a 序列 ...
随机推荐
- idea下使用码云插件进行git提交
1)下载插件 file->setting->plugins->右侧搜索gitee->安装->重启ide 2)配置版本控制 file->setting->Ver ...
- shell脚本,打印九九乘法表。
[root@localhost ~]# .sh #!/bin/bash #计算九九乘法表 ` do ` do [ $j -le $i ] && echo -n "$i*$j= ...
- java在线聊天项目0.3版本 制作客户端窗体,实现发送按钮和回车发送信息功能,使用ActionListener监听事件中actionPerformed方法(用内部类和匿名内部类两种方法)
方法一,使用匿名内部类的监听方法,因方法一致代码稍冗余 package com.swift; import java.awt.BorderLayout; import java.awt.Color; ...
- mysql的字符串处理函数用法
1.LOCATE函数 LOCATE(substr,str) 返回子串 substr 在字符串 str 中第一次出现的位置.如果子串 substr 在 str 中不存在,返回值为 0.如果substr或 ...
- react事件代理
参考:https://github.com/youngwind/blog/issues/107 首先回顾以下原生事件的两个方法:event.stopImmediatePropagation 和 eve ...
- Python的第3堂课
20181119笔记 一.内存管理相关 ①Cpython解释器的垃圾回收机制 什么是垃圾:当一个值没有被绑定任何变量名(即该值的引用计数为零时),该值就是垃圾. 垃圾回收是收回值占用的内存空间. 引用 ...
- Python-约瑟夫环
n个人(以编号0,1,2,3...n-1分别表示)围坐在一张圆桌周围.从编号为0的人开始报数1,数到m的那个人出列: 他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的 ...
- Verilog学习笔记基本语法篇(八)········ 结构说明语句
Verilog中的任何过程都可以属于以下四种结构的说明语句; 1) initial; 2) always; 3) task; 4) function; 1) initial说明语句: 一个程序 ...
- Html + Css 小知识点
选择器 根据选择器来对html内的内容做css修饰 样式: 找到一个元素{ 样式:值: } 找到一个元素:选择器 css都在style标签内部写 1.标签选择器: 根据标签名查找. 小丽: 2.id选 ...
- Java-转换原始类型为一个字符串
package com.tj; public class MyClass implements Cloneable { public static void main(String[] args) { ...