解题报告 最小波动
2011-11-09 17:24
169 查看
最小波动
最小波动是在一串数种出现的一种现象,给定n个数Ai,第i个数的最小波动k=min{|Aj-Ai|}(1=<j<i).而第一个数的最小波动为A1本身。
下面我们给定一串数,让你求出对于每个Ai的最小波动的和。
输入格式
第一行一个整数n(n<=200000),表明字串中数的个数。
接下来n行,每行一个整数Ai,(-32767=<Ai<=32767);
输出格式
一个数sum表示最小波动的和。
输入样例
6
5
1
2
5
4
6
输出格式
12
呃,这个题据说可以用 BST(平衡树),但是这个东西 NOIP 不考,对付这种水题又有一种杀鸡牛刀的感觉,所以,模贪(模拟+贪心)水过。
首先,挨个读入,与此同时,每读入一个 x ,v[x]:=true ,然后如果这个 x 不是第一项,就将它往两边找,一直到找到一个 true ,然后,取它们的abs 差值 ,加到 ans 上。
代码 (SueMiller)
program ACRush;
var v:array[-50000..50000]of boolean;
i,j,k,top,t1,t2,n,temp,min,max:longint;
ans:longint;
begin
assign(input,'min.in');reset(input);
assign(output,'min.out');rewrite(output);
readln(n);
fillchar(v,sizeof(v),false);
readln(temp);
ans:=temp;
v[temp]:=true;
max:=temp;
min:=temp;
for i:=2 to n do
begin
readln(temp);
if v[temp] then continue;
if temp>=max then
begin
inc(ans,temp-max);
v[temp]:=true;
max:=temp;
continue;
end;
if temp<=min then
begin
v[temp]:=true;
inc(ans,min-temp);
min:=temp;
continue;
end;
k:=temp;
j:=temp;
while (not v[k]) and (not v[j]) do
begin
if (k>max) and (j<min) then break;
if k<=max then inc(k);
if j>=min then dec(j);
end;
if v[k] then inc(ans,abs(k-temp))
else inc(ans,abs(j-temp));
v[temp]:=true;
end;
writeln(ans);
close(input);close(output);
end.
最小波动是在一串数种出现的一种现象,给定n个数Ai,第i个数的最小波动k=min{|Aj-Ai|}(1=<j<i).而第一个数的最小波动为A1本身。
下面我们给定一串数,让你求出对于每个Ai的最小波动的和。
输入格式
第一行一个整数n(n<=200000),表明字串中数的个数。
接下来n行,每行一个整数Ai,(-32767=<Ai<=32767);
输出格式
一个数sum表示最小波动的和。
输入样例
6
5
1
2
5
4
6
输出格式
12
呃,这个题据说可以用 BST(平衡树),但是这个东西 NOIP 不考,对付这种水题又有一种杀鸡牛刀的感觉,所以,模贪(模拟+贪心)水过。
首先,挨个读入,与此同时,每读入一个 x ,v[x]:=true ,然后如果这个 x 不是第一项,就将它往两边找,一直到找到一个 true ,然后,取它们的abs 差值 ,加到 ans 上。
代码 (SueMiller)
program ACRush;
var v:array[-50000..50000]of boolean;
i,j,k,top,t1,t2,n,temp,min,max:longint;
ans:longint;
begin
assign(input,'min.in');reset(input);
assign(output,'min.out');rewrite(output);
readln(n);
fillchar(v,sizeof(v),false);
readln(temp);
ans:=temp;
v[temp]:=true;
max:=temp;
min:=temp;
for i:=2 to n do
begin
readln(temp);
if v[temp] then continue;
if temp>=max then
begin
inc(ans,temp-max);
v[temp]:=true;
max:=temp;
continue;
end;
if temp<=min then
begin
v[temp]:=true;
inc(ans,min-temp);
min:=temp;
continue;
end;
k:=temp;
j:=temp;
while (not v[k]) and (not v[j]) do
begin
if (k>max) and (j<min) then break;
if k<=max then inc(k);
if j>=min then dec(j);
end;
if v[k] then inc(ans,abs(k-temp))
else inc(ans,abs(j-temp));
v[temp]:=true;
end;
writeln(ans);
close(input);close(output);
end.
相关文章推荐
- 最小和[CODEVS1635]解题报告
- Leetcode 64. Minimum Path Sum 最小路径和 解题报告
- BZOJ 3894 网络流最小割 解题报告
- URAL 1277 网络流最小割 解题报告
- Pku acm 2075 Tangled in Cables数据结构题目解题报告(十一)最小生成树:prim算法&amp;amp;二叉查找树
- POJ 3020(最小路径覆盖)解题报告
- 【解题报告】 HDU 1102 Constructing Roads -- 并查集 最小生成树 Prime算法
- 解题报告——把数组排成最小的数
- 【九度OJ】题目1170:找最小数 解题报告
- 最小生成树 prim POJ 2349解题报告
- Pku acm 1861 NetWork 数据结构题目解题报告(二) ----最小生成树:prim算法&amp;amp;Kruskal算法
- codevs 1078 最小生成树 解题报告
- Hdu 1879 继续畅通工程 最小生成树 解题报告
- 最小生成树——HDOJ 1233 还是畅通工程 解题报告
- BZOJ 3894 文理分科 解题报告 最小割 网络流 DINIC
- BOJ 热身赛 F题 解题报告 [最大流最小割 dinic]
- POJ 3101 Astronomy 解题报告(大数乘法+分数最小公倍数)
- Pku acm 2485 Highways数据结构题目解题报告(三) ----最小生成树:prim算法
- 最小年龄的3个职工(解题报告)
- BZOJ 1001 网络流最小割 解题报告