分析:暴力挺好打的,对于前30%的数据神搜,hi相同的数据将所有的建筑按照c从小到大排序,看最多能跳多少,ci=0的数据将所有的建筑按照h从小到大排序,枚举起点和终点,看能否跳这么多,取个max就可以了.这样70分就到手了.

部分分的提示还是比较明显的,要消除一个参数的影响,那么就按照h从小到大排序,显然只有可能顺着跳过城市,不能跳过去又跳回来.那么就是一个比较简单的dp了:f[i][j]表示跳了i次,最后一次跳到j的最小花费,转移的话枚举j之前的k就能转移了,最后倒叙枚举i看哪一个f[i][j]<=T就可以了.

多个参数有影响的常见策略是消除一个参数的影响,常见的办法就是排序,如果一个点不能经过多次,那么就想一个办法让它强行不经过这个点.

暴力:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, T, ans, vis[];
bool flag1 = true, flag2 = true; struct node
{
int c, h;
}e[]; bool cmp1(node a, node b)
{
return a.c < b.c;
} bool cmp2(node a, node b)
{
return a.h < b.h;
} void dfs(int u, int sum,int tot)
{
ans = max(ans, tot + );
vis[u] = ;
for (int i = ; i <= n; i++)
{
if (!vis[i])
{
int huafei = abs(e[i].h - e[u].h) + e[u].c;
if (sum + huafei <= T)
dfs(i, sum + huafei, tot + );
}
}
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
scanf("%d", &e[i].c);
if (e[i].c != )
flag2 = false;
}
for (int i = ; i <= n; i++)
{
scanf("%d", &e[i].h);
if (i != && e[i].h != e[i - ].h)
flag1 = false;
}
scanf("%d", &T);
if (n <= || (!flag1 && !flag2))
{
for (int i = ; i <= n; i++)
{
memset(vis, , sizeof(vis));
dfs(i,,);
}
printf("%d\n", ans);
}
else
if (flag1)
{
sort(e + , e + + n, cmp1);
int res = , cur = ;
while (cur <= n && res <= T)
{
ans++;
res += e[cur].c;
cur++;
}
printf("%d\n", ans - );
}
else
{
sort(e + , e + + n, cmp2);
for (int i = ; i <= n; i++)
{
int j = i + , res = ;
while (j <= n && res <= T)
{
res += abs(e[j].h - e[j-].h);
j++;
}
ans = max(ans, j - i + );
}
printf("%d\n", ans - );
} return ;
}

正解:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n,T;
int f[][]; struct node
{
int c, h;
}e[]; bool cmp(node a, node b)
{
return a.h < b.h;
} int main()
{
memset(f, / , sizeof(f));
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d", &e[i].c);
for (int i = ; i <= n; i++)
scanf("%d", &e[i].h);
scanf("%d", &T);
sort(e + , e + + n, cmp);
f[][] = e[].c;
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
for (int k = j + ; k <= n; k++)
f[i + ][k] = min(f[i + ][k], f[i][j] + e[k].h - e[j].h + e[k].c); for (int i = n; i >= ; i--)
for (int j = ; j <= n; j++)
if (f[i][j] <= T)
{
printf("%d\n", i + );
return ;
}
printf("0\n"); return ;
}

最新文章

  1. vim easy-align插件使用
  2. sharepont 2013 隐藏Ribbon 菜单
  3. VS 工程的 输出路径和工作路径的区别
  4. Java集合源码分析(一)
  5. dom4j解析xml文档(增删改查)
  6. 关于@Html.Action()的异常“控制器或该控制器未实现 IController。”
  7. Swift标示符以及关键字
  8. DOS命令行中用MAVEN构建 Java 和 Java Web 项目
  9. 面试题 41 和为s的两个数字VS 和为S的连续整数序列
  10. Linux企业级项目实践之网络爬虫(23)——系统测试:找出系统中的bug
  11. Spark 算子
  12. php json_encode url链接出现双转义字符‘\\’和中文被编码的解决方法
  13. Python的下划线_
  14. Web打印控件Lodop实现表格物流单的打印
  15. 用 Homebrew 带飞你的 Mac
  16. python pip NameError:name &#39;pip&#39; is not defined”
  17. error:crosses initialization of ...
  18. 【第三篇】SAP ABAP7.5x新语法之程序结构&amp;SubScreen
  19. App WebView实例化
  20. java装配bean

热门文章

  1. mysql——免安装配置
  2. DotnetCore(1)尝鲜构建Web应用
  3. mysql 的索引hash和b+tree 区别
  4. codechef: ADAROKS2 ,Ada Rooks 2
  5. 二分搜索 POJ 3258 River Hopscotch
  6. 1393 0和1相等串 鸽笼原理 || 化简dp公式
  7. C. Coin Troubles 有依赖的背包 + 完全背包变形
  8. SQL server中的T-SQL语句
  9. Set,Map与Array,Object对比
  10. PHP开发心得二