n个怪物围成一圈,每个怪物有自己的血量和爆炸伤害。
怪物在死后会对下一个怪物造成爆炸伤害,又死了又可以爆炸......
你每发子弹可以对怪物造成1点伤害,求杀死所有怪物的最小子弹数。

传送门

\(\color{Red}{---------------------华丽分割线w(゚Д゚)w------------------------}\)

\(其实嘛,看到题目束手无策,但是看到数据范围会发现是个O(n)算法,那我们要开始找规律了。\)

\(首先还是想最坏情况,每个怪物都用子弹打,答案是所有怪物的血量和。\)

那么我们得出一个很沙雕但很重要的结论:尽可能利用爆炸伤害

\(爆炸伤害在最优时是每个怪物都炸下一个怪物,这样爆炸伤害和就是\)

\[\sum_{i=1}^{n-1}{min(本怪物爆炸伤害,下一个怪物血量)}+min(最后一个怪物爆炸伤害,第一怪物血量)
\]

但是这个伤害是打不出来的,因为我们需要一个起始点 。

很明显我们取一个爆炸伤害对自己炸的血量最少的怪物为起点,这样其余所有爆炸伤害都可以打出来。

\(答案是sum(怪物血量和)-sum(爆炸伤害)+(爆炸贡献最小的一次爆炸伤害)\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=300009;
ll t,n,a[maxn],b[maxn],c[maxn],explore,sumn,minn=1e18;
int main()
{
cin>>t;
while(t--)
{
minn=1e18,sumn=0,explore=0;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&a[i],&b[i]);
sumn+=a[i];
}
for(int i=1;i<=n-1;i++)
{
c[i]=min(b[i],a[i+1]),explore+=c[i];
minn=min(minn,c[i]);
}
c[n]=min(b[n],a[1]);
minn=min(minn,c[n]);
explore+=c[n];
cout<<sumn-explore+minn<<endl;
}
}

最新文章

  1. jquery和zepto的扩展方法extend
  2. 记一次ASP.NET MVC性能优化(实际项目中)
  3. oracle中将自建用户下的所有表删除
  4. Javascript之Prototype
  5. Win7下Boost库的安装
  6. Django练习项目之搭建博客
  7. 第五篇、 WebSphere8.5的安装
  8. RMAN-06496: must use the TO clause when the database is mounted or open
  9. C++程序设计实践指导1.2二维数组的操作运算改写要求实现
  10. php 大数组的POST问题解决
  11. 基于CefGlue的桌面应用开发
  12. C指针1
  13. 掌握SQLServer锁的相关概念
  14. json与javabean之间的转化
  15. C#中++i与i++的区别
  16. 关于VXLAN的认识-----基础知识
  17. LeetCode(81): 搜索旋转排序数组 II
  18. topcoder srm 500 div1
  19. Flask系列02--Flask中的request
  20. xstream中几个注解的含义和用法(转)

热门文章

  1. awk线程号
  2. 【python实现卷积神经网络】批量归一化层实现
  3. C语言小练习之学生信息管理系统
  4. 利用 Github 网络钩子实现自动化部署
  5. linux基础知识点扫描
  6. python输出中文乱码
  7. 掌握MySQL连接查询到底什么是驱动表
  8. mybatis源码学习:插件定义+执行流程责任链
  9. Java 多线程实现方式二:实现 Runnable 接口
  10. 当git上只做文件大小写重命名的修改时,如何躲坑