预计分数:100+0+60=160
实际分数:100+0+60=160
mmpT1数据错了。。。
T1遭遇
题目描述
你是能看到第一题的 friends呢。
—— hja
?座楼房,立于城中 。
第?座楼,高度 ℎ?。
你需要一开始选择座楼,跳。 在第 ?座楼准备跳需要 ??的花费。 每次可以跳到任何一个还没有过的楼上去。但是代价,另外一座楼的代价是两高度差绝对值 ,最后一次从楼上跳到地面不需 要代价(只能跳到地上一次)。为在不超过 要代价(只能跳到地上一次)。为在不超过 ?的情况下,最多跳几次楼。 (一座楼 只能 跳一次 ,且每次 跳楼 都要 计算 准备 的花费 )
输入输出格式
输入格式:
第一行个整数 ?,代表 楼的数量。
接下来一行 ?个整数代表 ??。
接下来一行 ?个整数代表 ℎ?。
最后一行个整数 ?。
输出格式:
一行个整数 代表答案 。
输入输出样例
43 5 4 112 13 17
3【样例解释】从1号楼跳到 2号楼再跳到 3号楼是一种 可行 的方案 。
说明
对于 30%的数据, 1≤?≤5。
对于另外 20%的数据,所有 ℎ?相同。
对于另外 20%的数据, ??=0。
P104 zhx 遭遇
第 3 页 共 6 页
对于 100%的数据, 1≤?≤50,1≤??,ℎ?≤106,1≤?≤107。
不会做,不过70分的算法貌似比较好想
但是h相等的情况貌似写炸了,。。。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 const int MAXN=101; 9 const int INF=0x7ffff; 10 inline int read() 11 { 12 char c=getchar();int flag=1,x=0; 13 while(c<'0'||c>'9') { if(c=='-') flag=-1;c=getchar();} 14 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();return x*flag; 15 } 16 int n,bg;//kashi 17 struct node 18 { 19 int c; 20 int h; 21 }a[MAXN]; 22 int comp(const node &a,const node &b) 23 { 24 return a.c =900) 41 { 42 printf("%d",ans); 43 exit(0); 44 } 45 vis[i]=1; 46 dfs(i,spend+a[i].c+abs(a[now].h-a[i].h),have+1); 47 vis[i]=0; 48 } 49 } 50 } 51 int flagh=1;//高度是否相同 52 int flagc=1;//花费是否都为0 53 inline void solvec()//花费都为0 54 { 55 sort(a+1,a+n+1,comp2); 56 for(int i=1;i<=n;i++)//从每一个点往后跳 57 { 58 int nowjump=0; 59 int nowspend=0; 60 for(int j=i+1;j<=n;j++) 61 { 62 63 if(abs(a[j].h-a[j-1].h)+nowspend<=T) 64 { 65 nowspend=abs(a[j].h-a[j-1].h)+nowspend; 66 nowjump+=1; 67 } 68 ans=max(ans,nowjump+1); 69 } 70 } 71 } 72 inline void solveh() 73 { 74 int nowjump=0; 75 int nowspend=-1; 76 if(a[1].c<=T) 77 { 78 nowspend=a[1].c; 79 for(int i=2;i<=n;i++) 80 if(nowspend+a[i].c<=T) 81 nowjump++,nowspend+=a[i].c; 82 } 83 84 if(nowspend!=-1) ans=max(ans,nowjump+1); 85 } 86 int main() 87 { 88 // freopen("meet.in","r",stdin); 89 // freopen("meet.out","w",stdout); 90 bg=clock(); 91 n=read(); 92 for(int i=1;i<=n;i++) a[i].c=read(); 93 for(int i=1;i<=n;i++) a[i].h=read(); 94 T=read(); 95 sort(a+1,a+n+1,comp); 96 for(int i=1;i<=n;i++) 97 if(a[i].c!=0) flagc=0; 98 for(int i=1;i<=n;i++) 99 for(int j=1;j<=n;j++) 100 if(a[i].h!=a[j].h&&i!=j)101 flagh=0;102 if(flagc) solvec();103 if(flagh) solveh();104 105 for(int i=1;i<=n;i++)106 if(a[i].c<=T) 107 vis[i]=1,dfs(i,a[i].c,1);108 printf("%d",ans);109 return 0;110 }
正解:
1(by myl)
考虑跳楼的集合
一定会有∑Ci
按照高度排序
高度差的代价==h5-h1
枚举最矮的楼,最高的楼
按照C排序,一个一个的选
总花费Hj-Hi+Ci+Cj+∑选出来的Ci<=T的最大值
复杂度:$O(N^3logN)$
2(by zhx)
dp
按照从低向高排序
$f[i][j]$表示停留在i,已经跳了j栋楼,的最小花费
枚举下一次跳哪栋楼
$f[k][i+1]=min( f[k][j+1],f[i][j]+C[k]+abs(hk-hi) )$
复杂度:$O(n^3)$
统计答案的时候枚举i,j观察是否<=T
1 #include2 #include 3 #include