CodeForces 433C Ryouko's Memory Note(暴力加中位数)
来源:互联网 发布:进口数据 编辑:程序博客网 时间:2024/06/05 21:50
题意:给你一堆数字,允许你修改相同的数字成为别的数字,不过只能修改一次,问你修改后相邻数字的距离和最小是多少。
首先明确一个结论,一个数轴上一些点,要求一个与他们距离之和尽量小的点,那么这个点就是这些点的中位数,即排序后位于中间的数,为何?设这个点为C,如果C位于左边有7个点,右边有3个点的位置,当C点往左边移动到第7个点的位置,假设移动了d,那么左边的距离之和少了7d,右边的距离之和少了3d,那么总共的距离之和就少了4d,以此类推,直到中间的位置才是距离和最小的。
那么这道题就好做了,分别枚举每个不同的数字,然后对于他周围的数(不能等于本身)应用上面的结论再算出修改这个数所能得到的最小距离和,我不太清楚如何精确算复杂度下界,不过是不会超过o(mlog(m))的
AC代码:
#include<cstdio>#include<ctype.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<cstdlib>#include<stack>#include<cmath>#include<queue>#include<set>#include<ctime>#include<string.h>#include<string>using namespace std;#define ll long long#define eps 1e-8template<class T>inline void scan_d(T &ret){ char c; ret=0; while((c=getchar())<'0'||c>'9'); while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();}int a[100005];vector<int>sb[100005];ll dp[100005];int main(){ #ifdef GLQ freopen("input.txt","r",stdin);// freopen("o2.txt","w",stdout); #endif // GLQ int n,m,i,j; while(~scanf("%d%d",&n,&m)) { for(i = 1; i <= n; i++) { sb[i].clear(); } for(i = 1; i <= m; i++) scan_d(a[i]); ll sum = 0; if(n == 1 || m == 1) { printf("0\n"); continue; } if(a[1]!=a[2]) sb[a[1]].push_back(a[2]); memset(dp,0,sizeof(dp)); for(int i = 2; i <= m; i++) { dp[a[i-1]] += (ll)abs(a[i]-a[i-1]); dp[a[i]] += (ll)abs(a[i]-a[i-1]); if(a[i] != a[i-1]) sb[a[i]].push_back(a[i-1]); if(i != m && a[i] != a[i+1]) sb[a[i]].push_back(a[i+1]); sum += (ll)abs(a[i]-a[i-1]); } ll ans=0,temp; for(i = 1; i <= n; i++) if(!sb[i].empty()) { sort(sb[i].begin(),sb[i].end()); temp = sum - dp[i]; int sz = sb[i].size(); int k = sz/2; for(j = 0; j < sz; j++) { temp += abs(sb[i][k]-sb[i][j]); if(ans != 0 && temp >= ans) break; } if(ans == 0) ans = temp; else if(temp < ans) ans = temp; } printf("%lld\n",ans); } return 0;}
0 0
- CodeForces 433C Ryouko's Memory Note(暴力加中位数)
- Codeforces 433C Ryouko's Memory Note
- Codeforces 433 C. Ryouko's Memory Note
- Codeforces 433 C Ryouko's Memory Note
- Codeforces 433C Ryouko's Memory Note
- codeforces #433C Ryouko's Memory Note
- codeforces #433C Ryouko's Memory Note(瞎搞)
- CodeForces 433C Ryouko's Memory Note (数学)
- CF 433C Ryouko's Memory Note
- C. Ryouko's Memory Note
- Codeforces Round #248 (Div. 2) C.Ryouko's Memory Note
- Codeforces Round #248 (Div. 2) C. Ryouko's Memory Note
- Codeforces Round #248 (Div. 2) C - Ryouko's Memory Note
- Codeforces RoundC. Ryouko's Memory Note
- CF 248 C. Ryouko's Memory Note
- Codeforces433 C Ryouko’s Memory Note
- Ryouko's Memory Note(书本翻页)
- codeforces248(div1) A. Ryouko's Memory Note
- [寒江孤叶丶的CrossApp之旅_08][入门系列]CASegmentedControl的简单介绍
- Oracle 12c及oracle sql developer登陆scott时都出现ORA-01017错误的解决方法
- 第一课(3)STM32_RCC
- ZOJ 3818 正则表达式
- JAVA设计模式--简单工厂模式
- CodeForces 433C Ryouko's Memory Note(暴力加中位数)
- 修改UIButton
- Java 4类8种基本数据类型都有相应的包装类
- Android多点触摸手势滑动的一种简单方法
- ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol
- 论啃书的正确方式
- tomcat容器的EOFException异常
- ArcGIS Desktop软件安装和试用说明
- Warning[Pe061]: integer operation result is out of range