CodeForces - 626E 三分

5人阅读 评论(1) 收藏 举报
分类:

题意:给n个数,从这n个数里,任意选一些数,使得这些数的平均值减去中位数尽可能的大

精度卡的好恶心啊。。。。。

首先发现集合个数一定是奇数,任何一个个数为偶数的集合,都可以通过去掉中间较大的那个数,来增大或不变这个值

如1 2 3 4 可以去掉3变成1 2 4

排序后,枚举每个数做中位数,然后三分集合个数

确定中位数之后,剩下的数肯定是越大越好,

会发现这个值并不是随着集合个数单调变化的,所以要三分求凸点。

直接double除法,会有精度问题,可以转换成乘法比较

换了好几种三分形式,都不对。。。。各种怀疑。。。。并不是很理解。。

ac代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int a[maxn], n;
long long s[maxn];
long long fun(int x, int cnt){
	int l = x - cnt;
	int r = n - cnt + 1;
	long long sum = s[n] - s[r - 1] + s[x] - s[l - 1];
	return sum - 1ll * (2 * cnt + 1) * a[x];
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		scanf("%d", &a[i]);
	}
	sort(a + 1, a + n + 1);
	if(n <= 2){
		cout << 1 << endl;
		cout << a[1] << endl;
		return 0;
	}
	for(int i = 1; i <= n; i++){
		s[i] = s[i - 1] + a[i];
	}
	long long minn = 0, ans_index = 1, ans_count = 0;
	for(int i = 2; i < n; i++){
		int le = 1, ri = min(i - 1, n - i);
		long long minn_now = 0, ans = 0;
		while(le <= ri){
			int mid1 = (le + ri) >> 1;
			int mid2 = (ri + 1 + mid1) >> 1;
			long long f1 = fun(i, mid1);
			long long f2 = fun(i, mid2);
			if(f1 * (2 * mid2 + 1) < f2 * (2 * mid1 + 1)){
				le = mid1 + 1;
			}
			else{
				ri = mid2 - 1;
			}
		}
		ans = le, minn_now = fun(i, le); 
	//	cout << i << " " << ans << endl;
		if(minn_now * (2 * ans_count + 1) > minn * (2 * ans + 1)){
			ans_index = i;
			ans_count = ans;
			minn = minn_now;
		} 
	}
	cout << ans_count * 2 + 1 << endl;
	for(int i = ans_index - ans_count; i <= ans_index; i++)
	cout << a[i] << " ";
	for(int i = n - ans_count + 1; i <= n; i++)
	cout << a[i] << " ";
	cout << endl;
	return 0;
} 

wa的代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int a[maxn], n;
long long s[maxn];
long long fun(int x, int cnt){
	int l = x - cnt;
	int r = n - cnt + 1;
	long long sum = s[n] - s[r - 1] + s[x] - s[l - 1];
	return sum - 1ll * (2 * cnt + 1) * a[x];
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		scanf("%d", &a[i]);
	}
	sort(a + 1, a + n + 1);
	if(n <= 2){
		cout << 1 << endl;
		cout << a[1] << endl;
		return 0;
	}
	for(int i = 1; i <= n; i++){
		s[i] = s[i - 1] + a[i];
	}
	long long minn = 0, ans_index = 1, ans_count = 0;
	for(int i = 2; i < n; i++){
		int le = 1, ri = min(i - 1, n - i);
		long long minn_now = 0, ans = 0;
		while(le < ri){
			int mid1 = (2 * le + ri) / 3;
			int mid2 = (le + 2 * ri) / 3;
			long long f1 = fun(i, mid1);
			long long f2 = fun(i, mid2);
			if(f1 * (2 * mid2 + 1) <= f2 * (2 * mid1 + 1)){
				le = mid1 + 1;
			}
			else{
				ri = mid2 - 1;
			}
		}
		ans = le, minn_now = fun(i, le); 
		if(minn_now * (2 * ans_count + 1) > minn * (2 * ans + 1)){
			ans_index = i;
			ans_count = ans;
			minn = minn_now;
		} 
	}
	cout << ans_count * 2 + 1 << endl;
	for(int i = ans_index - ans_count; i <= ans_index; i++)
	cout << a[i] << " ";
	for(int i = n - ans_count + 1; i <= n; i++)
	cout << a[i] << " ";
	cout << endl;
	return 0;
} 

也可以二分来做,比较一下mid+1和mid-1就可以了




查看评论

网络安全测试软件internet scanner学习笔记(1)

内容:What is Internet Scanner?Internet Scanner provides automated security vulnerability detection and...
  • acehq
  • acehq
  • 2001-05-23 10:26:00
  • 746

CodeForces 626E Simple Skewness

题目链接:http://codeforces.com/problemset/problem/626/E 题目大意:有k个数,选若干个数,使这几个数的平均值-中位数最大,输出任意一种方案 先排序...
  • LsFlyt
  • LsFlyt
  • 2016-02-19 21:51:24
  • 315

codeforces 626E - Simple Skewness

奇数个一定比偶数个好(不会证明) 然后函数是先增后减的,可以用二分 其实和自己想的差不多,就是不会证明自己的猜想……...
  • qq_21704477
  • qq_21704477
  • 2016-03-03 20:33:26
  • 138

Simple Skewness CodeForces - 626E (三分)

Define the simple skewness of a collection of numbers to be the collection’s mean minus its median. ...
  • elbadaernu
  • elbadaernu
  • 2017-08-23 21:39:40
  • 86

[三分套三分] Codeforces Gym 100307 NEERC 13 E. Easy Geometry

首先矩形的宽度对答案是单峰的 固定宽度 左端点对最大面积也是单峰的 然后三分套三分就好了#include #include #include using namespace std; typed...
  • u014609452
  • u014609452
  • 2017-04-18 21:19:41
  • 323

CodeForces 626E Simple Skewness(三分)

题意:给出一个数的集合,求平均数减去中位数最大的子集。 思路:首先可以证明的是这个集合里的元素个数一定为奇数。 假设这个差最大的子集中有偶数个元素,那么去掉中间较大的元素后对平均数减小的影响比对中...
  • u014664226
  • u014664226
  • 2016-04-08 00:53:05
  • 389

Codeforces 626E Simple Skewness(三分)

题目大意:给定一个n个数序列,选取一些数,使得这些数的平均数减中位数尽可能大。如有多个结果,随意输出一个。思路:先进行排序 选数时有两种情况,奇数个和偶数个,分别来看,设:奇数时 u是平均数...
  • ZHangFFYY
  • ZHangFFYY
  • 2017-08-02 21:30:10
  • 149

【CodeForces 626E】Simple Skewness (三分)

思路转自:http://www.cnblogs.com/flipped/p/5211693.html 题意 给出n个数的集合,求一个 (平均数-中位数)最大 (偏度最大)的子集,输出子集元...
  • qq_34374664
  • qq_34374664
  • 2017-08-31 15:27:32
  • 140

CodeForces 939E Maximize! 三分

题意:    有一个空的数列现在有两种操作1.向空的数列添加一个大于数列尾元素的数放在数列的尾部2.询问最大 子序列的(最大值-该子序列的平均值)的最大值(子序列不必连续)分析:    通过分析我们可...
  • lj130lj
  • lj130lj
  • 2018-02-22 00:23:48
  • 32

CodeForces 578C Weakness and Poorness(三分法+最大子段和)

题意: 题目定义了两个变量: poornesspoorness表示一个区间内和的绝对值。 weaknessweakness表示一个所有区间最大的poornesss 题目要求你求一...
  • HelloWorld10086
  • HelloWorld10086
  • 2015-09-19 10:17:56
  • 928
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 2952
    排名: 1万+
    最新评论