请教下POJ的2623,总是超时啊??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教下POJ的2623,总是超时啊??相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;

long partition(unsigned long s[],long p,long r)

long i,j;
unsigned long x,t;
x=s[r];
i=p-1;
for(j=p;j<r;j++)
if(s[j]<=x)

i++;
t=s[i];
s[i]=s[j];
s[j]=t;


t=s[i+1];
s[i+1]=s[r];
s[r]=t;
return (i+1);


unsigned long nth_element(unsigned long *data,long left,long right,long n)

long k=n-1;
if(left>right)
return -1;
while(1)

int i=partition(data,left,right);
if(k<i)
right=i-1;
else if(k>i)
left=i+1;
else
return data[i];



int main()

long n;
unsigned long a[250002];
cin>>n;
for(long i=0;i<n;i++)
cin>>a[i];
if(n&1)
cout<<nth_element(a,0,n-1,n/2+1)<<".0"<<endl;
else
printf("%lg\n",(double)(nth_element(a,0,n-1,n/2)+nth_element(a,0,n-1,n/2+1))/2);
return 0;

参考技术A 估计有特殊的数据,专门卡你的非随机化算法
你试试看这组数据会不会超时
250000
1
2
3
...(省略249996行)
250000

把你的partition随机化就可以了
具体做法是,首先取一个随机数q,并且p<=q<=r
然后交换s[q]和s[r]
然后接着你的x=s[r]...就可以了
也就是在partition的时候用一个随机的元素而不总是s[r]来进行分隔
这样就不会被有序的数组卡掉了

2570 大牛们请教,总是WA,思路跟HDU论坛上一样啊

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2570
#include <stdio.h>
int main()

int t,n;
double v,w,s,k,a;
double p[110],max,temp;
int i,j;
int local;
while(scanf("%d",&t)!=EOF)

while(t--)

scanf("%d%lf%lf",&n,&v,&w);
for(i=0;i<n;i++)

scanf("%lf",&p[i]);

for(i=n;i>0;i--)

max=p[0];
local=0;
for(j=0;j<i;j++)
if(max<p[j])

max=p[j];
local=j;

temp=p[i-1];
p[i-1]=p[local];
p[local]=p[i-1];

s=0;
k=0;
a=0;
for(i=0;i<n;i++)

a=a+p[i]/100*v; //a为溶质
s=a/(v*(k+1));
if(s<=w/100)
k++;
else

a=a-p[i]/100*v;
s=a/(v*(k));


printf("%.0lf %.2lf\n",k*v,k==0?0:s);


return 0;

请大家帮我看下哪里错,我郁闷一上午了

你代码的主要问题是实数的处理不到位,给你一组错误的数据,题目能用整数做就不要用实数做,实数在计算机当中的表示是近似值而不是准确值
1
2 1 6
5 7
(0.05+0.07不一定等于0.06+0.06哦)
对于实数的处理,一般给出一个误差eps,认为两个数只要在这个误差内,就算两个数相等

下面给出我的代码。
//Code by SCROOKE 2010-1-28 11:21:07
//Code for 紫英落 (baidu)
//HDU 2570

#include <iostream>
#include <algorithm>

using namespace std;

int main()

int n,p,q,r,s,t;
int a[100];
scanf("%d",&n);
while (n--)

scanf("%d%d%d",&p,&q,&t);
for (s=0;s<p;s++)

scanf("%d",&a[s]);
a[s]-=t;

sort(a,a+p);
r=0;
for (s=0;s<p;s++)
if (r+a[s]<=0)
r+=a[s];
else break;
if (s)
printf("%d %.2f\n",s*q,0.01*t+r*0.01/s);
else printf("%d %.2f\n",0,0);

return 0;
参考技术A 看了下自己的提交。没做过。
但是感觉可以用贪心算法解。

等我解解看

已解。AC代码如下,纯粹的贪心算法,重点在排序和溶质的计算
#include <iostream>
#include <algorithm>
using namespace std;

int main()

int n, v, w, a[101], i, vol, c;
double p;
cin >> c;
while (c--)
cin >> n >> v >> w;
vol = 0;
p = 0;
for (i = 1; i <= n; i++)
cin >> a[i];

sort(&a[1], &a[n] + 1);
for (i = 1; i <= n; i++)
if ((vol * p + v * a[i]) / (vol + v) > w)
break;
else
p = (vol * p + v * a[i]) / (vol + v);
vol += v;


printf("%d %.2lf\n", vol, p / 100);


以上是关于请教下POJ的2623,总是超时啊??的主要内容,如果未能解决你的问题,请参考以下文章

请教:mysql给数据库添加数据文件:总是添加不成功?

请问linux下ln -sf啥意思啊 。 请教指点。感激不尽 。

请教ThinkPHP为啥会这么容易数据库查询超时

可不可以想你请教一下,怎么在hypermesh里设置面接触啊?nastran的求解器。

请教高手:SocketAsyncEventArgs 类服务端如何设置心跳超时

请教下FPGA完整设计流程