bzoj2697: 特技飞行
2016-01-04 01:48
423 查看
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2697
题意:中文题。。
分析:看到这题时。脑子里第一印象是dp?因为感觉很好dp的样子?然后发现dp方程好像不是很好设。在仔细想想,样例是怎么样得来的呢?仔细算了算,发现好像有好多中方式构造。然后想了想贪心?感觉如果在首尾放最大值好像很优的样子,并且这个时候看出来了-->无论怎么放,都只与自己的间隔有关?不会互相影响?然后我发现一个很重要的问题。所有的Ci前面乘的系数x(题目说的两个相同操作直接的时间间隔),每次的贡献是x*Ci。本来我的证明很笨,也不严谨,既然要写博客,所以去看了眼别人的证明。。我的思路是将价值从大到小排序,然后每次将最大的放在当前空间的两端,并且很显然在这中间之后再放一次当前最大值是不会影响这个值对答案的贡献的。证明如下:对于两种物品设Ci>=Cj。有Li,Ri,Lj,Rj。我们要证明的是Li<Lj<Rj<Ri是最优的。首先Lj<Li<Ri<Rj显然是要更差的,我们只要证明Li<Lj<Ri<Rj也更差(另一种相交的情况同理)即可,而这种情况是显然比我们的猜想要更差。得证。其实和我之前的猜想是差不多的,要让x的总和最大化,同时也要让每一份得到最大化的价值。
代码:
#include<map> #include<set> #include<cmath> #include<queue> #include<math.h> #include<cstdio> #include<vector> #include<string> #include<cstring> #include<iostream> #include<algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const int N=1010; const int MAX=151; const int MOD=1000007; const int MOD1=100000007; const int MOD2=100000009; const int INF=2100000000; const double EPS=0.00000001; typedef long long ll; typedef unsigned long long ull; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int a ; int main() { int i,n,k,l,r,ans=0; scanf("%d%d", &n, &k); for (i=1;i<=k;i++) scanf("%d", &a[i]); sort(a+1,a+k+1); l=1;r=n; for (i=k;i>0;i--) if (l>r) break ; else { ans+=(r-l)*a[i];l++;r--; } printf("%d\n", ans); return 0; } /* 5 2 2 2 */
相关文章推荐
- vc mfc 中的listctrl控件 垂直滚动条置于最底端
- sf
- 三:网络--数据安全/加密
- 浅谈 jQuery 核心架构设计
- github团队合作管理代码
- 2015年总结2016展望
- 递归
- 电子线路设计技巧2:0603 1%电阻阻值表示方法
- 在https的链接中vb使用post提交xml数据
- VB调用WebService(直接Post方式)并解析返回的XML
- Runloop 运行循环
- 二:网络--GET请求和POST请求
- 迪士尼黑科技:爬墙机器人 VertiGo
- Android中去掉显示标题的方法
- 美团酒店Node全栈开发实践
- session与cookie技术应用(附详细代码示例以及注释)
- 使用自定义视图的AlertDialog
- 高效的删除数组中的空值
- WIN10系统刷联想A3000H(MT65XX系统)
- 图记 2016.1.4