Rating of Tetris
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 3072/1024 K (Java/Others)Total Submission(s): 126 Accepted Submission(s): 46
Problem Description
话说Lele发明了 New Tetris 这个游戏后,经过两天的小推广,立刻风靡亚洲。
为了更好的把这个游戏推广到全世界,Lele从Topcoder获得灵感,开发了一套系统量化并记录下每个人在每天的水平(定义为Rating),这样好让选手更好的分析自己并促进自己成长。为了更精确,Lele系统里的Rating并不像Topcoder里只采用整数,而是采用了小数,甚至可能存在负数(比得实在太差了)。
突然有一天,无聊到发慌的Lele看了一下自己的Rating,竟然很神奇的符合下面这个函数:
其中变量x的代表是哪一天,并且可以看作弧度用于sin函数的计算。函数F(x)表示在x天时的Rating。
Lele又定义了一个概念,Rating和。出于某种特殊原因,Lele把从日期A到日期B的Rating和定义为从时间A到时间B(包括)的每一天的Rating中,除掉最高的3个Rating,剩下其他Rating的和。
现在给你两个日期A和B,请你计算这段时间内Lele的Rating和
为了更好的把这个游戏推广到全世界,Lele从Topcoder获得灵感,开发了一套系统量化并记录下每个人在每天的水平(定义为Rating),这样好让选手更好的分析自己并促进自己成长。为了更精确,Lele系统里的Rating并不像Topcoder里只采用整数,而是采用了小数,甚至可能存在负数(比得实在太差了)。
突然有一天,无聊到发慌的Lele看了一下自己的Rating,竟然很神奇的符合下面这个函数:
其中变量x的代表是哪一天,并且可以看作弧度用于sin函数的计算。函数F(x)表示在x天时的Rating。
Lele又定义了一个概念,Rating和。出于某种特殊原因,Lele把从日期A到日期B的Rating和定义为从时间A到时间B(包括)的每一天的Rating中,除掉最高的3个Rating,剩下其他Rating的和。
现在给你两个日期A和B,请你计算这段时间内Lele的Rating和
Input
本题目包含多组测试,请处理到文件结束。
每组测试包含两个正整数A,B(0<A,B<1000001),并且题目保证这个时间间隔大于3天
每组测试包含两个正整数A,B(0<A,B<1000001),并且题目保证这个时间间隔大于3天
Output
对于每组测试,在一行里面输出该范围之内Lele的Rating和。
四舍五入至小数点后一位。
四舍五入至小数点后一位。
Sample Input
1 5 1 1000000
Sample Output
-5.4 -4990444779.0Hint请注意该题目的内存限制
Author
linle
Source
2007暑期集训队练习赛(2)
Recommend
lcy
#include
<
iostream
>
#include < math.h >
using namespace std;
double c1 =- 4990454799.0 ,c2 =- 4990454799.0 ,c3 =- 4990454799.0 ;
void swap( double & a, double & b)
... {
double tem=a;
a=b;
b=tem;
}
void sort( double & a) // 保存最大的三个数
... {
if(a>c1)
...{
c1=a;
//保证c1最小
if(c3<c1)
swap(c3,c1);
if(c2<c1)
swap(c2,c1);
}
}
int main()
... {
cout.setf(ios::fixed);
cout.precision(1);
int A,B,temp;
while(cin>>A>>B)
...{
c1=-4990454799.0,c2=-4990454799.0,c3=-4990454799.0;
if(A>B)
...{
temp=A;
A=B;
B=temp;
}
double f,sum=0;
for(int i=A;i<=B;i++)
...{
f=log(double(i)/10.1)/log(3.0)-sin(double(i))-double(i)/100;
sort(f);
sum+=f;
}
sum=sum-c1-c2-c3;
if (fabs(sum)<0.044444445)
cout<<0.0<<endl;
else cout<<sum<<endl;
}
}
#include < math.h >
using namespace std;
double c1 =- 4990454799.0 ,c2 =- 4990454799.0 ,c3 =- 4990454799.0 ;
void swap( double & a, double & b)
... {
double tem=a;
a=b;
b=tem;
}
void sort( double & a) // 保存最大的三个数
... {
if(a>c1)
...{
c1=a;
//保证c1最小
if(c3<c1)
swap(c3,c1);
if(c2<c1)
swap(c2,c1);
}
}
int main()
... {
cout.setf(ios::fixed);
cout.precision(1);
int A,B,temp;
while(cin>>A>>B)
...{
c1=-4990454799.0,c2=-4990454799.0,c3=-4990454799.0;
if(A>B)
...{
temp=A;
A=B;
B=temp;
}
double f,sum=0;
for(int i=A;i<=B;i++)
...{
f=log(double(i)/10.1)/log(3.0)-sin(double(i))-double(i)/100;
sort(f);
sum+=f;
}
sum=sum-c1-c2-c3;
if (fabs(sum)<0.044444445)
cout<<0.0<<endl;
else cout<<sum<<endl;
}
}
PS:这个题使我们重创不小,这么简单的题竟然做了N长时间。改进了3次,WA了N次终于提交成功了!
1、c1,c2,c3要在每次输入时进行初始(这次是加了个函数,没有注意~~)
2、找出最大的三个数,我只想出了这样一种方法(sort( )),找不到好的方法,如有,请留言告诉我,谢谢~
3、注意内存限制