关于输入一组数据求最小的问题
问题链接:
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 100010 int 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 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; }
我要坚持一年,一年后的成功才是我想要的。