https://vjudge.net/problem/ZOJ-3450

题意

一座位落(X0,Y0)的城市将遭受n个敌人的摧残。现在我们手上有某科学的超电磁炮,每次攻击都是一条射线,对于共线的敌人,必须先打倒离得近的。打倒每个敌人需花费Ti时间,并歼灭Wi个小兵。如今只剩下T0时间了!问怎么射击才可杀最多?

分析

把位于同一个射线的敌人分为一组,处于后面的敌人的时间和价值是叠加的。这样进行背包dp。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define random(a, b) rand()*rand()%(b-a+1)+a
#define pi acos(-1.0)
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+10;
const int maxm = 1e5+10;
const ll mod = 1e9+7;struct ND{ll x,y,t,w;ND(){}ND(int _x,int _y,int _t,int _w){ x=_x,y=_y,t=_t,w=_w; }bool operator <(const ND &a)const{return x*x+y*y<a.x*a.x+a.y*a.y;}
}p[1010];
bool aLine(ND a,ND b){if(a.x*b.y==a.y*b.x) return a.x*b.x>=0&&a.y*b.y>=0;return false;
}
vector<ND> group[1010];
bool vis[1010];
ll dp[10100];
int main(){
#ifdef LOCALfreopen("in.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
#endifint x0,y0,t,n;while(~scanf("%d%d%d%d",&x0,&y0,&n,&t)){for(int i=0;i<n;i++){scanf("%lld%lld%lld%lld",&p[i].x,&p[i].y,&p[i].t,&p[i].w);group[i].clear();p[i].x-=x0;p[i].y-=y0;}
//        if(aLine(p[0],p[1])) puts("YED");sort(p,p+n);//按距城市的距离排序memset(vis,false,sizeof(vis));int cnt=0;for(int i=0;i<n;i++){//分组if(!vis[i]){group[cnt].push_back(p[i]);vis[i]=true;for(int j=i+1;j<n;j++){if(aLine(p[i],p[j])){vis[j]=true;if(p[j].t==0){group[cnt][group[cnt].size()-1].w+=p[j].w;continue;}group[cnt].push_back(p[j]);group[cnt][group[cnt].size()-1].w+=group[cnt][group[cnt].size()-2].w;group[cnt][group[cnt].size()-1].t+=group[cnt][group[cnt].size()-2].t;}}cnt++;}}
//        for(int i=0;i<cnt;i++){
//            for(int j=0;j<group[i].size();j++){
//                cout<<'('<<group[i][j].x<<','<<group[i][j].y<<')'<<' ';
//            }cout<<endl;
//        }memset(dp,0,sizeof(dp));for(int i=0;i<cnt;i++){for(int j=t;j>=0;--j){for(int k=0;k<group[i].size()&&group[i][k].t<=j;k++){dp[j]=max(dp[j],dp[j-group[i][k].t]+group[i][k].w);}}}cout<<dp[t]<<endl;}return 0;
}

转载于:https://www.cnblogs.com/fht-litost/p/9508083.html

ZOJ - 3450 Doraemon's Railgun (dp)相关推荐

  1. ZOJ 3450 Doraemon's Railgun (DP·分组背包)

    题意  多啦A梦有一个超电磁炮  然后要打死n堆敌人  在同一条射线上的敌人只有先打死前面的一堆才能打后面的一堆  给你打死某堆敌人需要的时间和这堆敌人的人数   问你在T0时间内最多打死多少个敌人 ...

  2. 【ZOJ - 1163】The Staircases(dp)

    题干: One curious child has a set of N little bricks. From these bricks he builds different staircases ...

  3. ZOJ 1743 Concert Hall Scheduling(DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=743 题意:有两个音乐厅出租.给出n个租客,每个租客有个租的时间段[L ...

  4. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

  5. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  6. LeetCode 1220. 统计元音字母序列的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...

  7. LeetCode 265. 粉刷房子 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...

  8. LeetCode 256. 粉刷房子(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...

  9. LeetCode 1223. 掷骰子模拟(DP)

    1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...

最新文章

  1. leetcode2. 两数相加--每天刷一道leetcode系列!
  2. python判断是否有属性
  3. IOS开发之----异常处理
  4. boost::stl_interfaces::reverse_iterator相关的测试程序
  5. 将JavaScript集成到QML中
  6. uniapp开发微信小程序时,报错:Now you can provide attr `wx:key` for a `wx:for` to improve performance
  7. Android Studio 3.3 Beta提供了新的Android代码压缩器R8
  8. C++设计模式-Flyweight享元模式
  9. CentOS6.5+Python2.7+ GIT +IPython
  10. Okay 第一篇文章从java字符串开始
  11. 【原】IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
  12. 使用阿里云容器镜像的 github关联仓库,海外机器构建 Docker 镜像
  13. RAPIDXML 中文手册,根据官方文档完整翻译!
  14. COMSOL吸附模拟
  15. 《最伟大的作品》,解密周杰伦新专辑背后的数据密码
  16. matlab独立t样本检验,matlab与单样本t检验
  17. 小学计算机课题研究方案,课题研究方案范文《小学信息技术课堂有效教学的探索》...
  18. Js、Vue阻止事件冒泡行为
  19. mysql id不重复随机码_MySQL 随机不重复ID,该怎么处理
  20. 认清影响因子引发的是是非非,善待逆境中顽强崛起的国产期刊

热门文章

  1. mobl中title颜色的设置
  2. 今年今日==我的生日
  3. 福到啦L1-6 福到了(15 分) “
  4. Android Context完全解析,你所不知道的Context的各种细节
  5. 搜狗输入法输入,字母全是大写且之间有间隔
  6. 高利转贷”“职业放贷”是违法借贷行为
  7. e3是合法浮点数吗_下面四个选项中,均是不合法的浮点数的选项是
  8. Intel Xeon E7-8880v4 性能评测 阿里云第四代ECS服务器CPU
  9. 第四十五天 百度地图定位SDK
  10. (转)Unity 5.6 光照烘焙系统介绍