水题(Checkpoints,cf 709B)
来源:互联网 发布:淘宝卖家怎么查看投诉 编辑:程序博客网 时间:2024/06/05 05:31
在数轴上,给出n个点的坐标和你现在的坐标。输出最少的行走距离,使你访问至少n-1个点。
其实就是选一个点不访问,这个点选最左或最右即可。
可以先往左走,再往右走。
或者先往右走,再往左走。
1个点直接输出0。
一开始分了9类在那讨论来讨论去的,最后还错了。
可能是我觉得分得详细,每一类就相对简单,不容易错,而且每一类都保证不重不漏。
但是有时候,真的,有些情况你忽视掉了,怎么分你都还是会遗漏。(类是没分错,但有一些细小的东西是与如何分类无关的)
而且9类讨论起来十分麻烦,花去了你大量精力,却收效甚微。(依然无法发现那些细小的东西)
事实上如果可以分成一个或几个大类+一个或几个特例便是最好。但一定要证明不重不漏。毕竟不如分成9类那么有逻辑。很容易在分类上出错。
省下的时间和精力可以多去想想有没有什么情况被你忽视掉了。
我说的细小的东西大概是指你最小的类中的任何情况。
其实也不能一概而论,只能说在这题中,分九类不值。
我遗漏的情况是:
当选择不去最左边的点时,只考虑了先左后右。
当选择不去最右边的点时,只考虑了先右后左。
然后,尽量不要写一长串式子,不方便检查,也容易错。如:
printf("%d\n",min(min(abs(a-l2),abs(a-r1))+abs(r1-l2),min(abs(a-l1),abs(a-r2))+abs(l1-r2)));
写成这样岂不更好?
int ans1=min(abs(a-l2),abs(a-r1))+abs(r1-l2);int ans2=min(abs(a-l1),abs(a-r2))+abs(l1-r2);printf("%d\n",min(ans1,ans2));
AC代码
分九类
<pre name="code" class="cpp">#include<bits/stdc++.h>using namespace std;int main(){ int n,a; scanf("%d %d",&n,&a); vector<int>l; vector<int>r; int temp; while(n--) { scanf("%d",&temp); if(temp<a) l.push_back(temp); if(temp>a) r.push_back(temp); } sort(l.begin(),l.end()); sort(r.begin(),r.end()); if(l.size()==0) { if(r.size()==0) puts("0"); else if(r.size()==1) puts("0"); else printf("%d\n",r[r.size()-2]-a); } else if(l.size()==1) { if(r.size()==0) puts("0"); else if(r.size()==1) printf("%d\n",min(r[0]-a,a-l[0])); else printf("%d\n",min(min(r[r.size()-1]-a,a-l[0]+r[r.size()-2]-l[0]),r[r.size()-2]-a+r[r.size()-2]-l[0])); } else { if(r.size()==0) printf("%d\n",a-l[1]); else if(r.size()==1) printf("%d\n",min(min(a-l[0],r[0]-a+r[0]-l[1]),a-l[1]+r[0]-l[1])); else printf("%d\n",min(min(a-l[0]+r[r.size()-2]-l[0],r[r.size()-1]-a+r[r.size()-1]-l[1]),min(r[r.size()-2]-a+r[r.size()-2]-l[0],a-l[1]+r[r.size()-1]-l[1]))); } return 0;}
一个大类+一个特例
#include<bits/stdc++.h>using namespace std;int main(){ int n,a; scanf("%d %d",&n,&a); vector<int>pt; int temp; for(int i=1;i<=n;i++) { scanf("%d",&temp); pt.push_back(temp); } sort(pt.begin(),pt.end()); if(n==1) puts("0"); else { int l1=pt[0]; int l2=pt[1]; int r1=pt[pt.size()-1]; int r2=pt[pt.size()-2]; printf("%d\n",min(min(abs(a-l2),abs(a-r1))+abs(r1-l2),min(abs(a-l1),abs(a-r2))+abs(l1-r2))); } return 0;}
0 0
- 水题(Checkpoints,cf 709B)
- codeforces 709B - Checkpoints
- CodeForces 709B - Checkpoints
- CodeForces 709B Checkpoints
- Codeforces 709B Checkpoints ( 模拟)
- Codeforces Problem 709B Checkpoints(分类讨论)
- CF 327B (水题)
- AIM Tech Round 3 (Div. 2) -- B. Checkpoints (枚举)
- CF#805 B. 3-palindrome(水题)
- CF 551 B 水题
- CF 17B 水题
- CF 170(div2)B
- CF 2 B(dp)
- cf(415 A,B)
- CF#803 B. Distances to Zero(水题)
- CF#807 B. T-Shirt Hunt(水题)
- CF#808 B. Average Sleep Time(水题)
- cf-B
- 如何在QT中实现C语言中调用C++的函数
- adfasdf
- 五十道编程小题目 --- 14 java
- B-tree/B+tree/B*tree
- Linux C 调用脚本
- 水题(Checkpoints,cf 709B)
- [转]RTP协议全解析(H264码流和PS流)
- handler——Handler详细使用方法实例
- Solr6 集群
- android Mvp模式
- BroadCastReceiver
- python中re模块详解
- 库、链接资源汇总
- 【SurfaceView】SurfaceView的初步学习