权值
【问题描述】:
有一个长度为n的实数序列,,下标从1开始,其中第k个位置的实数为p · (sin(a · k + b) + cos(c · k + d) + 2),sin和cos采用弧度制,其中p,a,b,c,d均为给定的整数。你需要从这个序列中选择两个位置(可以相同),使前边的位置上的数字减去后边的位置上的数字最大。如果选择了两个相同的位置,那么差为0.
【输入】:
一行六个整数p,a,b,c,d,n。
【输出】:
一行一个实数表示最大的差值,保留六位小数。
【输入输出样例】:
weight.in weight.out
100 432 406 867 60 1000 399.303813
【数据范围】:
对于30%的数据,1<=p,a,b,c,d<=1000,1<=n<=1000;
对于全部的数据,1<=p,a,b,c,d<=1000,1<=n<=10^6。
【解题思路】
话说这个题并不需要什么思路。。。暴力循环枚举什么的就好了。不过一定要注意看题目!
【源代码】
1 program weight; 2 var p,a,b,c,d,n,maxx,i:longint; 3 ans,max:real; 4 f,e:array[1..100000000] of real; 5 begin 6 assign(input,'weight.in'); 7 assign(output,'weight.out'); 8 reset(input); 9 rewrite(output); 10 read(p,a,b,c,d,n); 11 for i:=1 to n do 12 begin 13 f[i]:=sin(a*i + b) + cos(c * i + d); 14 if f[i]>max then 15 begin 16 max:=f[i]; 17 maxx:=i; 18 end; 19 e[i]:=f[maxx]-f[i]; 20 if e[i]>ans then ans:=e[i]; 21 end; 22 writeln(ans*p:0:6); 23 close(input); 24 close(output); 25 end.