决定在 codeforces 练题啦,决定每个比赛刷前四道。。。太难就算了

796A Buying A House

题意:给出x轴上的n 个点,每个点有个权值,问离m 点最近的权值小于等于k 的点离m的距离。单位是10。

思路:大水题。用l、r分别向左向右找即可。

代码:

 #include<stdio.h>
int main(){
int n, m, k;
int w[];
while(~scanf("%d%d%d", &n, &m, &k)){
for(int i=; i<=n; i++){
scanf("%d", &w[i]);
}
int l=m-, r=m+;
while(l>= || r<=n){
if(l>= && w[l]<=k && w[l]!=) break;
if(r<=n && w[r]<=k && w[r]!=) break;
l--;
r++;
}
printf("%d0\n", r-m);
}
return ;
}

796A AC代码

796B Find The Bone

题意:x轴上有n 个点,其中m 个有洞,初始一个球放在坐标1 ,有k 次操作,每次操作给出两个坐标,交换两个坐标的内容,如果球落入洞中,则不能再移动,问k 次操作后,球的位置。

思路:简单模拟。用pos表示球的当前位置,用pause表示球还能否移动,用u 数组标记每个位置是否有洞。有一个坑就是要判断一下初始位置有没有洞。

代码:

 #include<stdio.h>
#include<string.h>
bool u[];
int main(){
int n, m, k, x, y;
while(~scanf("%d%d%d", &n, &m, &k)){
memset(u, , sizeof(u));
for(int i=; i<m; i++){
scanf("%d", &x);
u[x]=;
}
int pos=;
bool pause=u[]?true:false;
while(k--){
scanf("%d%d", &x, &y);
if(!pause){
if(x==pos) pos=y;
else if(pos==y) pos=x;
if(u[pos]==) pause=true;
}
}
printf("%d\n", pos);
}
return ;
}

796B AC代码

796C Bank Hacking

题意:给出n 个结点的树,每个结点有各自的权值,你有w 的力量,可以取走权值小于w 的结点,要求一一取走这n 个结点,取走x 结点后所有和x 相邻的还有次相邻(就是距离是2)的结点权值加1(必须处于连通状态),问w 的最小值。注意,第一个取走结点的位置可以自己挑,后面的必须是已取走结点的邻点。

思路:

  被题意坑了好久,假设图为1-2-3-4,先取走3,然后1、2、4的权值加1,现在取走2,1的权值加1(4的权值不会改变,因为2-4已经不连通)。除掉题意的坑以外,这题还是很简单的,假设你先取走x 点,所有x 的邻接点权值加1,其余点权值都加2。所以,w 的值只取决于第一个取走的点。

  n 的值高达30万,所以肯定不能用n^2解决,我呢,先把所有结点权值加2,接着存入优先队列。然后枚举第一个取走的点,用get(i)表示他的最大值,get(i)里面不断取出队头,如果是i,则权值-2继续判断,如果是i 的邻点,则权值-1继续判断,如果是其余的结点,则答案就出来了,接着将取出的点再放入优先队列。

代码:

 #include<stdio.h>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
#define N 300005
#define INF 1e9 struct Node{
int x, w;
bool operator < (Node b) const{
return w<b.w;
}
};
priority_queue<Node> q; map<pair<int, int>, bool> mp; void add(int a, int b){
mp[make_pair(a, b)]=;
mp[make_pair(b, a)]=;
} queue<Node> tq;
int get(int a){
int maxt=-INF;
while(q.size()){
Node tmp = q.top();
tq.push(tmp);
q.pop();
bool flag=;
if(mp.find(make_pair(a, tmp.x))!=mp.end()){ //邻边-1
tmp.w-=;
flag=;
}
else if(tmp.x==a) tmp.w-=, flag=; //根-2
if(flag && maxt>=tmp.w) break;
if(maxt->tmp.w) break;
maxt=max(maxt, tmp.w);
}
while(tq.size()){
q.push(tq.front());
tq.pop();
}
return maxt;
} int main(){
int n, a, b;
while(~scanf("%d", &n)){
while(q.size()) q.pop();
for(int i=; i<=n; i++){
scanf("%d", &a);
a+=;
Node tmp;
tmp.x=i;
tmp.w=a;
q.push(tmp);
}
mp.clear();
for(int i=; i<n; i++){
scanf("%d%d", &a, &b);
add(a, b);
}
int mint=get();
for(int i=; i<=n; i++){
mint=min(mint, get(i));
}
printf("%d\n", mint);
}
return ;
}

796C AC代码

796D Police Stations

题意:有n 个城市,其中m 个城市有警察局,要求每个城市离警察局距离不能大于d,接下来给出n 个城市之间的路(是一根树,所以n-1条路),问最多可以删掉多少条路。

思路:

  广搜。挺难的,我先是思路错了wa,后来思路对了,又tle了好几次。每个城市离警察局不能超过d,那么我从每一个警察局出发,对于每一个城市,用num表示最多还可以走几步(警察局的num等于d),第一次bfs 就用于求出num数组。接着第二次bfs,从每一个警察局出发,如果从该警察局到城市x 后还可以走d 步,这个d<num[x]时,这条路肯定可以不要,如果d==num[x]且城市x 第一次到达,则保留下来,如果不是第一次到达,也可以删掉。处理的时候要小心。。

  刚开始我第一个bfs 也是对每一个警察局开始广搜,结果超时,其实可以把所有警察局加入队列,然后进行一次广搜即可。

代码:

 #include<stdio.h>
#include<string.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std; #define N 300005
bool u[N]; struct Point{
Point(int cx, int cd){
x=cx;
d=cd;
}
int x, d;
}; vector<Point> v[N];
int num[N]; void add(int x, int y, int i){
Point p(y, i);
v[x].push_back(p);
p.x=x;
v[y].push_back(p);
}
bool vis[N];
int ans[N], ao; queue<Point> q;
void bfs(){
while(q.size()){
Point a = q.front();
q.pop();
for(int i=; i<v[a.x].size(); i++){
int ad=v[a.x][i].x;
Point b(ad, a.d-);
if(b.d>num[b.x]){
num[b.x]=b.d;
if(b.d>) q.push(b);
}
}
}
} void bfs2(int s, int k){
Point p(s, k);
q.push(p);
while(q.size()){
Point a = q.front();
q.pop();
for(int i=; i<v[a.x].size(); i++){
int ad=v[a.x][i].x, bno=v[a.x][i].d;
Point b(ad, a.d-); if(b.d==num[b.x] && u[b.x]==){
u[b.x]=;
vis[bno]=;
q.push(b);
}
else if(vis[bno]==){
vis[bno]=;
ans[ao++]=bno;
}
}
}
} int main(){
int n, m, k, x, y;
while(~scanf("%d%d%d", &n, &m, &k)){
memset(u, , sizeof(u));
memset(num, -, sizeof(num));
for(int i=; i<m; i++){
scanf("%d", &x);
u[x]=;
num[x]=k;
Point tmp(x, k);
q.push(tmp);
}
for(int i=; i<=n; i++) v[i].clear();
for(int i=; i<n; i++){
scanf("%d%d", &x, &y);
add(x, y, i);
} bfs(); memset(vis, , sizeof(vis));
ao=;
for(int i=; i<=n; i++){
if(u[i]==){
bfs2(i, num[i]);
}
} printf("%d\n", ao);
for(int i=; i<ao; i++){
printf("%d", ans[i]);
if(i==ao-) printf("\n");
else printf(" ");
}
}
return ;
}

796D AC代码

codeforces 796A-D的更多相关文章

  1. 【codeforces 796A】Buying A House

    [题目链接]:http://codeforces.com/contest/796/problem/A [题意] 让你选一个最靠近女票的,且能买的房子; 输出你和你女票的距离; [题解] 枚举 [Num ...

  2. CodeForces - 796A Buying A House

    思路:从m直接向两边枚举,如果当前点需要的费用小于等于k,说明一定是最近距离. AC代码 #include <cstdio> #include <cmath> #include ...

  3. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  4. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  5. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  6. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  7. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  8. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  9. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

随机推荐

  1. 10个小技巧助您写出高性能的ASP.NET Core代码

    今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能,本文的大部分内容来自翻译,当然中间穿插着自己的理解,希望对大家有所帮助!话不多说开始今天的主题吧! 我们都知道性能是公共网 ...

  2. 死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计

    问题 (1)CopyOnWriteArraySet是用Map实现的吗? (2)CopyOnWriteArraySet是有序的吗? (3)CopyOnWriteArraySet是并发安全的吗? (4)C ...

  3. ASP.NET Core中使用GraphQL - 第三章 依赖注入

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 SOL ...

  4. 用SpringCloud进行微服务架构演进

    在<架构师必须要知道的阿里的中台战略与微服务> 中已经阐明选择SpringCloud进行微服务架构实现中台战略,因此下面介绍SpringCloud的一些内容,SpringCloud已经出来 ...

  5. SpringBoot + Spring Security 学习笔记(三)实现图片验证码认证

    整体实现逻辑 前端在登录页面时,自动从后台获取最新的验证码图片 服务器接收获取生成验证码请求,生成验证码和对应的图片,图片响应回前端,验证码保存一份到服务器的 session 中 前端用户登录时携带当 ...

  6. Spring Boot配置定时任务

    在项目开发过程中,经常需要定时任务来做一些内容,比如定时进行数据统计(阅读量统计),数据更新(生成每天的歌单推荐)等. Spring Boot默认已经实现了,我们只需要添加相应的注解就可以完成定时任务 ...

  7. 【转载】解析 java 按值传递还是按引用传递

    原文链接  说明: (1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递. (2):在Java里面只有基本类型和 ...

  8. 【转载】java final 关键字的几种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  9. C# 30分钟完成百度人脸识别——进阶篇(文末附源码)

    距离上次入门篇时隔两个月才出这进阶篇,小编惭愧,对不住关注我的卡哇伊的小伙伴们,为此小编用这篇博来谢罪. 前面的准备工作我就不说了,注册百度账号api,创建web网站项目,引入动态链接库引入. 不了解 ...

  10. 关于图片适配不同尺寸的image View(实战)

    分享人:广州华软 佐罗 一. 前言 在前端开发过程中,设计稿中往往只提供一张图片,但是app内需要用到的尺寸各种各样. 同时图片不仅是信息的直接表达,也会为网站起到美观点缀的作用,图片的变形.过分裁切 ...