MEET&&jump


only 50% data which i can solve is in this meet!
code:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long n,c[60],h[60],deta[60]; bool v[60]; long long abss(long long x){ if(x<0) return -x; return x; } long long jump(long long x,long long money,long long step,long long T){ bool tt=false,ttt=true; long long ans=0; for(int i=1;i<=n;i++) if(v[i]==false){ for(int j=1;j<=n;j++) if(j!=i&&v[j]==false) ttt=false; break; } v[x]=true; if(ttt==false){ for(int i=1;i<=n;i++) if(v[i]==false&&money+abss(h[x]-h[i])+c[x]<=T){ long long t=jump(i,money+abss(h[x]-h[i])+c[x],step+1,T); if(ans<t) ans=t; tt=true; } if(tt==true) return ans; return step;} if(ttt==true) if(money+c[x]<=T) return step+1; else return step; } int main(){ freopen("meet.in","r",stdin); freopen("meet.out","w",stdout); scanf("%lld",&n); memset(c,0,sizeof(c)); memset(h,0,sizeof(h)); for(int i=1;i<=n;i++) scanf("%lld",&c[i]); for(int i=1;i<=n;i++) scanf("%lld",&h[i]); long long T=0; scanf("%lld",&T); bool j1=true,j2=true; for(int i=1;i<n;i++) if(h[i]!=h[i+1]) j1=false; for(int i=1;i<=n;i++) if(c[i]!=0) j2=false; long long ans=0; if((j1==false&&j2==false)||n==1) for(int i=1;i<=n;i++){ memset(v,false,sizeof(v)); long long t=jump(i,0,0,T); if(ans<t) ans=t; } else if(j1==true){ long long mo=0; sort(c+1,c+1+n); int cnt=0; while(c[cnt]+mo<=T){ cnt++; ans++; mo+=c[cnt]; } } else if(j2==true){ sort(h+1,h+1+n); long long m=0; for(int i=1;i<n;i++) deta[i]=h[i+1]-h[i]; for(int i=1;i<=n;i++) if(deta[i]+m<=T){ m+=deta[i]; ans++; } } printf("%lld",ans); fclose(stdin); fclose(stdout); return 0; }
首先我想到的是分解数据,对特殊数据进行特殊处理,能分则分。
先不要想 100% .........
1. h[i]相等。
变成了最短路径问题,但没有起点与终点,类似于dfs.
“选择一栋楼挑”————枚举每一点当起点.{
dfs其余点。
if(money<=T){
money+=c[x];
for(int i=1;i<=n;i++)
if(v[i}==false)
dfs();
}
}
2.ordinary:
类似1.,但money+h[x]-h[i]<=T;
3.c[i]==0——all;
unsovle;
开始我没看懂题,unclear。
但是通过样例,知道“代价“与“花费”的区别——跳到地上无代价。屁!
posted on 2017-11-05 20:58 Sakura'duke 阅读(159) 评论(0) 收藏 举报
浙公网安备 33010602011771号