(1)读题
将题目要求转化为有好几座山,对于每座山,ans+=(最高高度-最低高度),最终结果就是答案。
(2)做题
此题调试十分困难。
正解
#include<cstdio> #include<iostream> using namespace std; int a[200000]; int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } if(n==1){ printf("%d\n",a[1]); return 0; } int ans=0; int tmpMax=-1;//当前山峰 int tmpMin=0; bool isDowning=false;//是否在下降 for(int i=1;i<=n;i++){//枚举每个位置 int nowVal=a[i]; if(nowVal>tmpMax){//即将上升 tmpMax=nowVal; if(i==n){//结束 ans+=tmpMax-tmpMin; } }else{//下降时的处理 isDowning=true; if(i==n){ ans+=tmpMax-tmpMin; break; } if(n>i&&a[i+1]>a[i]){//即将进入另一座山 //如果之前在下降,回退,将这段区间的价值计入答案 ans+=(tmpMax-tmpMin); //回归初始值 tmpMin=a[i]; tmpMax=a[i+1]; if(i+1==n){ ans+=a[i+1]-a[i]; break; } isDowning=false; continue; } } } printf("%d\n",ans); return 0; }
对拍
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <fstream> #include <algorithm> #include <windows.h> using namespace std; //ofstream cout("data.in"); int main() { srand(time(0)); // srand( (unsigned)time( NULL ) ); //freopen("4.in","w",stdout); int n=rand()%100000+1; printf("%d\n",n); for(int i=1;i<=n;i++){ printf("%d ",rand()%1000+1); } printf("\n"); return 0; }
正解(递推)(题解)
#include<cstdio> #include<iostream> using namespace std; int a[200000]; int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int ans=0; for(int i=1;i<=n;i++){ if(a[i]>a[i-1]){ ans+=a[i]-a[i-1]; } } printf("%d\n",ans); return 0; }
对拍.bat
:again data > input.txt AC < input.txt > biaoda_output.txt qwq < input.txt > test_output.txt fc biaoda_output.txt test_output.txt if not errorlevel 1 goto again pause