时间限制:1s内存限制:256MB
【问题描述】给出一个随机的排列,请你计算最大值减最小值的差小于等于 0~n-1 的区间分别有多少个。
【输入】 输入文件名为 sum.in。
第一行一个数 T(<=10),表示数据组数
对于每一组数据:第一行一个数 n(1<=n<=100,000)
第二行 n 个数 a1...an,表示一个随机的排列
【输出】输出文件名为 sum.out。对于每组数据输出 n 行,分别表示差值小于等于 0~n-1 的区间个数
【输入输出样例】sum.in sum.out
1 4
4 5
3 2 4 1 7
10
【数据说明】对于 30%的数据,1<=n<=300;对于 60%的数据,1<=n<=5000 ;对于 100%的数据,1<=n<=100000.
比起上个星期的题目,这一次还算有点noip的水平(liang xin)(毕竟我终于会做一点了~虽然还不知道对不对。。。)
作为一名pascal选手,代码就是要简单粗暴(当我没说— …—|||)
文件的读入输出:
procedure fin;
begin
assign(input,'sum.in');
assign(output,'sum.out');
reset(input); rewrite(output);
end;
procedure fout;
begin
close(input);
close(output);
end;
变量定义:
var
maxn,minn,f,k,ans,j,i,t,n:longint;
s_cha,a:array[0..100010]of longint;
方案一:暴力 将文件的输入存入数组中,写两个在区间内寻找最值的函数,然后从1到n,每一次都去寻找max与min,找到之后进行比较,看是否与0~n-1的值相等,若相等则+1.
function max(l,r:longint):longint;//区间内找最大
var ff,i:longint;
begin
ff:=0;
for i:=l to r do if ff<a[i] then ff:=a[i];
exit(ff);
end;
function min(l,r:longint):longint;//区间内找最小
var ff,i:longint;
begin
ff:=maxlongint;
for i:=l to r do if ff>a[i] then ff:=a[i];
exit(ff);
end;
begin
//fin;
readln(t);
for f:=1 to t do begin
readln(n);
for i:=1 to n do begin
read(a[i]);
end;
ans:=0;
for i:=1 to n-1 do
if a[i]=a[i+1] then inc(ans);
s_cha[0]:=ans+n;
for i:=1 to n-1 do
begin
ans:=0;
for j:=1 to n do
for k:=j+1 to n do
if max(j,k)=i+min(j,k) then inc(ans);
s_cha[i]:=s_cha[i-1]+ans;
end;
for i:=1 to n do
writeln(s_cha[i-1]);
filchar(s_cha,sizeof(s_cha),0); //数组清0继续程序。
end;
//fout;
end.
由上述的暴力我们知道T(n)>=O(t*(n^3)),再看一下数据:1<=n<=100000,1<=t<=10,O(n^2)的要求啊~so。。。。
方法二: 比较巧妙的暴力~
直接暴力一边数组,把相应的差值数组自加。
begin
//fin;
readln(t);
for f:=1 to t do begin
readln(n);
for i:=1 to n do begin
read(a[i]);
end;
a[0]:=n;
for j:=1 to n do
begin
maxn:=a[j]; minn:=a[j];
for k:=j to n do begin
if a[k]<minn then minn:=a[k];
if a[k]>maxn then maxn:=a[k];
inc(s_cha[maxn-minn]); end;
end;
for i:=1 to n do
inc(s_cha[i],s_cha[i-1]);
for i:=1 to n do
writeln(s_cha[i-1]);
filchar(s_cha,sizeof(s_cha),0);
end;
//fout;
end.
不知道能不能过。。。
如果有点小问题请自行修改哦。
cpp代码:(文件的读入输出我就不写啦~\(≧▽≦)/~啦啦啦)
#include<bits/stdc++.h>
#define inf 100010
using namespace std;
int main()
{
int t,n,i,j,ans,k,minn,maxn;
int a[inf],s_cha[inf];
scanf("%d",&t);
for(int f=1;f<=t;f++){
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
for (j=1;j<=n;++j){
maxn=a[j]; minn=a[j];
for (k=j;k<=n;k++){
if(a[k]<minn) minn=a[k];
if(a[k]>maxn) maxn=a[k];
s_cha[maxn-minn]++;
}
}
for (i=1;i<=n;++i) s_cha[i]+=s_cha[i-1];
for (i=1;i<=n;++i) printf("%d\n",s_cha[i-1]);
memset(s_cha,0,sizeof(s_cha));
}
return 0;
}
终于会用csdn了,好开森啊
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)