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)    收藏  举报

导航