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

796A Buying A House

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

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

代码:

 1 #include<stdio.h>
 2 int main(){
 3   int n, m, k;
 4   int w[105];
 5   while(~scanf("%d%d%d", &n, &m, &k)){
 6     for(int i=1; i<=n; i++){
 7       scanf("%d", &w[i]);
 8     }
 9     int l=m-1, r=m+1;
10     while(l>=1 || r<=n){
11       if(l>=1 && w[l]<=k && w[l]!=0) break;
12       if(r<=n && w[r]<=k && w[r]!=0) break;
13       l--;
14       r++;
15     }
16     printf("%d0\n", r-m);
17   }
18   return 0;
19 }

796A AC代码

796B Find The Bone

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

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

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 bool u[1000005];
 4 int main(){
 5   int n, m, k, x, y;
 6   while(~scanf("%d%d%d", &n, &m, &k)){
 7     memset(u, 0, sizeof(u));
 8     for(int i=0; i<m; i++){
 9       scanf("%d", &x);
10       u[x]=1;
11     }
12     int pos=1;
13     bool pause=u[1]?true:false;
14     while(k--){
15       scanf("%d%d", &x, &y);
16       if(!pause){
17         if(x==pos) pos=y;
18         else if(pos==y) pos=x;
19         if(u[pos]==1) pause=true;
20       }
21     }
22     printf("%d\n", pos);
23   }
24   return 0;
25 }

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继续判断,如果是其余的结点,则答案就出来了,接着将取出的点再放入优先队列。

代码:

 1 #include<stdio.h>
 2 #include<vector>
 3 #include<queue>
 4 #include<map>
 5 #include<algorithm>
 6 using namespace std;
 7 #define N 300005
 8 #define INF 1e9
 9
10 struct Node{
11   int x, w;
12   bool operator < (Node b) const{
13     return w<b.w;
14   }
15 };
16 priority_queue<Node> q;
17
18 map<pair<int, int>, bool> mp;
19
20
21 void add(int a, int b){
22   mp[make_pair(a, b)]=1;
23   mp[make_pair(b, a)]=1;
24 }
25
26 queue<Node> tq;
27 int get(int a){
28   int maxt=-INF;
29   while(q.size()){
30     Node tmp = q.top();
31     tq.push(tmp);
32     q.pop();
33     bool flag=1;
34     if(mp.find(make_pair(a, tmp.x))!=mp.end()){ //邻边-1
35       tmp.w-=1;
36       flag=0;
37     }
38     else if(tmp.x==a) tmp.w-=2, flag=0; //根-2
39     if(flag && maxt>=tmp.w) break;
40     if(maxt-1>tmp.w) break;
41     maxt=max(maxt, tmp.w);
42   }
43   while(tq.size()){
44     q.push(tq.front());
45     tq.pop();
46   }
47   return maxt;
48 }
49
50 int main(){
51   int n, a, b;
52   while(~scanf("%d", &n)){
53     while(q.size()) q.pop();
54     for(int i=1; i<=n; i++){
55       scanf("%d", &a);
56       a+=2;
57       Node tmp;
58       tmp.x=i;
59       tmp.w=a;
60       q.push(tmp);
61     }
62     mp.clear();
63     for(int i=1; i<n; i++){
64       scanf("%d%d", &a, &b);
65       add(a, b);
66     }
67     int mint=get(1);
68     for(int i=2; i<=n; i++){
69       mint=min(mint, get(i));
70     }
71     printf("%d\n", mint);
72   }
73   return 0;
74 }

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 也是对每一个警察局开始广搜,结果超时,其实可以把所有警察局加入队列,然后进行一次广搜即可。

代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<set>
  4 #include<map>
  5 #include<vector>
  6 #include<queue>
  7 #include<algorithm>
  8 using namespace std;
  9
 10 #define N 300005
 11 bool u[N];
 12
 13 struct Point{
 14   Point(int cx, int cd){
 15     x=cx;
 16     d=cd;
 17   }
 18   int x, d;
 19 };
 20
 21 vector<Point> v[N];
 22 int num[N];
 23
 24 void add(int x, int y, int i){
 25   Point p(y, i);
 26   v[x].push_back(p);
 27   p.x=x;
 28   v[y].push_back(p);
 29 }
 30 bool vis[N];
 31 int ans[N], ao;
 32
 33
 34
 35 queue<Point> q;
 36 void bfs(){
 37   while(q.size()){
 38     Point a = q.front();
 39     q.pop();
 40     for(int i=0; i<v[a.x].size(); i++){
 41       int ad=v[a.x][i].x;
 42       Point b(ad, a.d-1);
 43       if(b.d>num[b.x]){
 44         num[b.x]=b.d;
 45         if(b.d>0) q.push(b);
 46       }
 47     }
 48   }
 49 }
 50
 51 void bfs2(int s, int k){
 52   Point p(s, k);
 53   q.push(p);
 54   while(q.size()){
 55     Point a = q.front();
 56     q.pop();
 57     for(int i=0; i<v[a.x].size(); i++){
 58       int ad=v[a.x][i].x, bno=v[a.x][i].d;
 59       Point b(ad, a.d-1);
 60
 61       if(b.d==num[b.x] && u[b.x]==0){
 62         u[b.x]=1;
 63         vis[bno]=1;
 64         q.push(b);
 65       }
 66       else if(vis[bno]==0){
 67         vis[bno]=1;
 68         ans[ao++]=bno;
 69       }
 70     }
 71   }
 72 }
 73
 74
 75 int main(){
 76   int n, m, k, x, y;
 77   while(~scanf("%d%d%d", &n, &m, &k)){
 78     memset(u, 0, sizeof(u));
 79     memset(num, -1, sizeof(num));
 80     for(int i=0; i<m; i++){
 81       scanf("%d", &x);
 82       u[x]=1;
 83       num[x]=k;
 84       Point tmp(x, k);
 85       q.push(tmp);
 86     }
 87     for(int i=1; i<=n; i++) v[i].clear();
 88     for(int i=1; i<n; i++){
 89       scanf("%d%d", &x, &y);
 90       add(x, y, i);
 91     }
 92
 93
 94     bfs();
 95
 96     memset(vis, 0, sizeof(vis));
 97     ao=0;
 98     for(int i=1; i<=n; i++){
 99       if(u[i]==1){
100         bfs2(i, num[i]);
101       }
102     }
103
104     printf("%d\n", ao);
105     for(int i=0; i<ao; i++){
106       printf("%d", ans[i]);
107       if(i==ao-1) printf("\n");
108       else printf(" ");
109     }
110   }
111   return 0;
112 }

796D AC代码

转载于:https://www.cnblogs.com/hchlqlz-oj-mrj/p/6735080.html

codeforces 796A-D相关推荐

  1. 【codeforces 796A】Buying A House

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

  2. codeforces 796A Buying A House

    题目链接:http://codeforces.com/contest/796/problem/A 题意:给你n个房子的价格ai,坐标1到n,你目前在m坐标处,还有你现在拥有的钱数k.每个房子与你的距离 ...

  3. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  4. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  5. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  6. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  7. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  8. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  9. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

最新文章

  1. 0.爬虫 urlib库讲解 urlopen()与Request()
  2. 教你一招画素描, 不写程序时陶冶陶冶情操
  3. Java 中的 BigDecimal 类你了解多少?
  4. WEBMIN在命令行下的安装
  5. python相册管理系统_Django实现一个相片管理系统01
  6. 先进的ListenableFuture功能
  7. 3617. 子矩形计数
  8. HashMap死锁原因及替代方案
  9. Qt error LNK2001: unresolved external symbol
  10. 海洋工作室成立啦!!
  11. seaborn.scatterplot学习
  12. python做考勤表_500行Python代码打造刷脸考勤系统,其实也就那么简单
  13. java对接支付宝三方登录
  14. cordova build时出错Minimum supported Gradle version is 5.4.1. Current version is 4.10.3
  15. Y7000联想拯救者gtx1050Ti安装cuda9.0
  16. vue2.0自学教程(一):走进vue2.0大观园
  17. CMS企业建站的经验
  18. (转载)JAVA小知识
  19. MYSQL5.7下载安装详细教程
  20. det曲线_11565 P-R、ROC、DET 曲线及 AP、AUC 指标全解析(上)

热门文章

  1. 最简单的基于FFmpeg的移动端例子:Android 视频转码器
  2. html搜索框代码_解放双手 | 10行Python代码实现一款网页自动化工具
  3. python热力图美化_python如何画热力图?
  4. Tomcat启动提示At least one JAR was scanned for TLDs yet contained no TLDs
  5. 2018百度之星程序设计大赛 - 资格赛 P1006三原色图(MST,并查集)
  6. java.servlet js,调用servlet方法
  7. 易语言修改虚拟机硬盘id_易语言本地虚拟机源码
  8. php索引数组转键数组,PHP-Codeigniter:如何从指定索引转换数组值?
  9. dbutils mysql_mysql之DBUtils
  10. mysql的-x是什么命令_Mysql常用命令