HDU 4355 Party All the Time(三分法搜索)

HDU 4355

思路:三分法求f(x)极值。

f(x)是指位置为x时的愤怒值之和,是一个三次函数,且存在极值点使f(x)最小。

code:

/*
* @author Novicer
* language : C++/C
*/
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
#define INF 2147483647
#define cls(x) memset(x,0,sizeof(x))
#define rise(i,a,b) for(int i = a ; i <= b ; i++)
using namespace std;
const double eps(1e-8);
typedef long long lint;

const int maxn = 500000 + 5;
double x[maxn];
double w[maxn];
int n;

double f(double pos){
	double sum = 0.0;
	for(int i = 1 ; i <= n ; i++){
		sum += (double)pow(abs(pos - x[i]) , 3) * w[i];
	}
	return sum;
}

double ts(double L , double R){
	double ans = -1;
	for(int i = 1 ; i < 30 ; i++){
		double mid1 = (L+R)/2.0;
		double mid2 = (mid1 + R)/2.0;
		if(f(mid1) >= f(mid2))
			L = mid1;
		else
			R = mid2;
	}
	ans = L;
	return ans;
}
int main(){
//	freopen("input.txt","r",stdin);
	int t ; cin >> t; int kase = 1;
	while(t--){
		cin >> n;
		double left = 1e7 , right = -1e7;
		for(int i = 1 ; i <= n ; i++){
			scanf("%lf%lf",&x[i],&w[i]);
			left = min(left , x[i]);
			right = max(right , x[i]);
		}
		printf("Case #%d: %.0f\n",kase++ , f(ts(left,right)));

	}
	return 0;
}

版权声明:博主表示授权一切转载:)

时间: 2024-10-08 00:01:01

HDU 4355 Party All the Time(三分法搜索)的相关文章

HDU 4597 Play Game (记忆化搜索)

题意:有两堆n张的卡片,每张卡片有一个得分,Alice和Bob轮流在两堆卡片的两端取卡片 问Alice先手,取得分数最多为多少: #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> #include <math.h> #define M 50 #define LL long long using

hdu 1501 Zipper (dfs+记忆化搜索)

Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6491    Accepted Submission(s): 2341 Problem Description Given three strings, you are to determine whether the third string can be formed

codeforces 782B The Meeting Place Cannot Be Changed+hdu 4355+hdu 2438 (三分)

B. The Meeting Place Cannot Be Changed The main road in Bytecity is a straight line from south to north. Conveniently, there are coordinates measured in meters from the southernmost building in north direction. At some points on the road there are n

Hdu 4771 Stealing Harry Potter&#39;s Precious (搜索)

题目大意: 地图上有最多4件物品,小偷要全部拿走,问最少的路程. 思路分析: 考虑到物品数量只有4. 可以先用最多5次bfs求出每个目标点到其他目标点的距离. 然后枚举依次拿取物品的顺序,用next_permutation... #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace

HDU 4355 Party All the Time 三分

很长时间都是在学习各位大神的力作,并汲取了不少养料,在此一并谢过各位大神了. 当然了,好东西是要跟大家一起分享的,最近发现了几个非常不错的个人站点,都是介绍IOS开发的,其中有唐巧.破船之长.池建强.王维等各位,其中不乏供职于腾讯和阿里这样的IT巨头,希望大家也能从他们的博客中学习到一些技术之外的东西.就不再啰嗦啦,附上地址:http://www.ityran.com/archives/4647 这几天在学习IOS7 CookBook,因为没有找到中文版,就硬着头皮啃原著吧,还真学到了不少东西,

HDU 3131 One…Two…Five! (暴力搜索)

题目链接:HDU 3131 One-Two-Five! (暴力搜索) 题意:给出一串数字,要求用加,减,乘,除(5/2=2)连接(计算无优先级:5+3*6=8*6=48),求所有结果中,含有'3'且该数字出现频率最大,若频率相等,输出数字最大的. 暴力解决之 AC代码: #include <stdio.h> #include <map> #include <string.h> #include <algorithm> #define LL __int64 u

hdu 3639 有向图缩点+建反向图+搜索

题意:给个有向图,每个人可以投票(可以投很多人,一次一票),但是一个人只能支持一人一次,支持可以传递,自己支持自己不算,被投支持最多的人. 开始想到缩点,然后搜索,问题是有一点想错了!以为支持按票数计算,而不是按人数!还各种树形dp/搜索求可以到达边数..提交WA了... 又反复读了题目之后才发现..错误..只要人数就行...问题简单了许多... 缩点成有向无环图后:每个SCC中支持的人数就是scc里面的人,要求可到达的点最多的点,当然要放过来求方便:反向图那个点可以到达的点最多!于是建反向图直

HDU 4355 Party All the Time(三分)

题目链接:HDU 4355 题面: Party All the Time Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5266    Accepted Submission(s): 1625 Problem Description In the Dark forest, there is a Fairy kingdom where

HDU 4355 Party All the Time 三分算法

HDU 4355 Party All the Time 三分算法 题意 给你N个人的位置x和相应重量w,他们要到达同一个位置p,他们每个人的花费的精力等于\(|s[i]-p|^{3}*w\),然后我们需要求一个位置,使得所有人的花费之和最小. 解题思路 根据上面的公式,我们可以知道这个函数不是一个简单的单调函数,最起码是个凹函数(这里需要一个数学上的知识),对于一般情况我们会使用二分法来进行处理,但是这里不是单调函数了,而是一个凹函数,这样我们就不能用二分了,新的算法应运而生--三分算法. 三分