2181Jumping Cows

没有AC它,但是我已经试过很多例子了,都通过,所以放弃做它了,贴上我的错误代码,这道题目要注意它的数值,150000啊,时限又是1秒,也就是10的9次方,如果你用了两重循环,可想而知,超过那个最大值,所以只能有一重循环,dp中一重循环的,我只有在最大非递增序列看到,还有那道hehe中见到,所以我尝试了一下跟hehe的算法,时间上符合题目的要求了,可是还是通不过,蛋碎啊

#include "string.h"
#include "iostream"
using namespace std;

int f[101000][510];
int n,num[101000],list[500],count=0;
int max(int a,int b){return a>b?a:b;}

void numtoarray(int array[],int a){
  int i=0,j;
  while(a>0){
   array[i++]=a%10;
   a=a/10;
  }
  if(count>i){
    for(j=i;j<=count;j++)array[j]=0;
  }
  else count=i;
  //count=max(count,i);
}

void work(){
  int i,flag,j,top=2,data;
  memset(f,0,sizeof(f));
  numtoarray(f[1],num[1]);
  //for(j=1;j<=n;j++)cout<<j<<' '<<num[j]<<endl;cout<<endl;
  for(i=2;i<=n;i++){
     if(num[i]>num[i-1]){
       data=num[i]-num[i-1];
       numtoarray(list,data);
       flag=0;
       //cout<<"data  "<<data<<endl;
       //cout<<"list  ";for(j=count-1;j>=0;j--)cout<<list[j];cout<<endl;

       for(j=0;j<count;j++){
       f[top][j]=f[top-1][j]+list[j]+flag;
       flag=f[top][j]/10;
       f[top][j]=f[top][j]%10;
       }
       if(flag!=0){
         f[top][j]=flag;
         count++;
       }
       //cout<<i<<' ';for(j=count-1;j>=0;j--)cout<<f[top][j];cout<<endl;
       top++;
     }
    //cout<<"* ";cout<<i<<' ';for(j=count-1;j>=0;j--)cout<<f[i][j];cout<<endl;
  }
  //for(i=1;i<top;i++)cout<<f[i]<<' ';cout<<endl;
  for(i=count-1;i>=0;i--)cout<<f[top-1][i];cout<<endl;
}


int main(){
    int i;
    cin>>n;
    for(i=1;i<=n;i++){
      cin>>num[i];
    }
    work();
}
原文地址:https://www.cnblogs.com/dowson/p/3267458.html