您的位置:首页 > 其它

关于输入一组数据求最小的问题

2014-07-29 15:14 253 查看
问题链接:

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1350

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1408

两个问题,自己第一个代码是没有敲出来的,第二个代码虽然是搞定了,

但是在处理是分析不清楚,使用了两个for循环,导致时间上相对于别人的代码有很大的差距。

自己AC的1408:

#include<iostream>
#include<cstdio>
#define M 100100
using namespace std;

int num[M],Max[M],Min[M];
//这个Max我不打算要了

int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,n,D;
long long ans;
cin>>T;
while(T--){
ans=0;
cin>>n>>D;
for(int i=0;i<n;i++) cin>>num[i];
//原来开始所有的结果都是保存在num这个数组当中

Max[0]=num[0];
//第一个
for(int i=1;i<n;i++)
{
if(Max[i-1]-num[i]>D)
//当结果是大于的时候,是不符合题目的要求的。
//直接让最大值返回,到Max数组,然后后面的数量关系会自动的调整好的
Max[i]=Max[i-1]-D;
else Max[i]=num[i];
}
//处理一次最大值,还要处理一次最小值,虽然还没有理解原因。
Min[n-1]=num[n-1];
for(int i=n-2;i>=0;i--)
{
if(Min[i+1]-num[i]>D)
Min[i]=Min[i+1]-D;
else Min[i]=num[i];
}

for(int i=0;i<n;i++)
ans+=(max(Min[i],Max[i])-num[i]);
//ans+=Min[i]-num[i];
//没看懂,取两个的最大值,然后和num[i]作差。
//然后不断的将结果返回到ans。什么情况?
cout<<ans<<endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: