首页 > 代码库 > 关于输入一组数据求最小的问题
关于输入一组数据求最小的问题
问题链接:
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 <algorithm>using namespace std;int main(){ int t; cin>>t; while(t--){ //在这里首先声明我是仅仅考虑了一般的情况,特殊情况待会在统一的考虑 int N,D,count = 1,index = 0; cin>>N>>D; int *a = new int [N];//每棵树苗都对应着一个点,将点的坐标保存在这里 for(int i = 0;i < N;i++)cin>>a[i]; sort(a,a+N); //下面的计算就是要将树苗的坐标记录下来,然后有一个count计数器进行计数 for(int i = 0;i < N;i = index){ int b = a[index] + D; for(int j = index;j < N;j++){ if(j<N&&a[j]>=b){ count++; index = j; break; } else index++; } } cout<<count<<endl; delete [] a; } return 0;}
淦珺在部分细节方面处理的比我好多了,在一for循环中是通过一个变量代表了一个数组,相对来说处理的方式就比我的优化
#include <iostream>#include <cstdio>using namespace std;#define N 100010int d[N];int main(){ int T,n,D,cnt,m; scanf("%d",&T); while(T--){ cnt=1; scanf("%d%d",&n,&D); scanf("%d",&d[0]); m=d[0]; for(int i=1;i<n;i++){ scanf("%d",&d[i]); if(d[i]-m>=D) cnt++,m=d[i]; } printf("%d\n",cnt); } return 0;}
第1305题AC代码:
#include<iostream>#include<cstdio>#define M 100100using 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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。