Codeforces Round #424 (Div. 2) D. Office Keys(贪心 二分 or DP)
来源:互联网 发布:写代码软件 编辑:程序博客网 时间:2024/06/07 12:54
题意:有n个人和k把钥匙(n<=1000, k<=2000, k>=n),n个人都必须拿一把钥匙去p点,一把钥匙不能多人拿。问最后每个人都到达p点最少需要多少时间。
思路:对人和钥匙都排序一下,然后有三种做法:
1.二分答案 贪心验证:左边的人取的钥匙越靠左 对右边的人的影响越小, 所以每次尽量取左边的钥匙
2.DP:转移方程:dp[i][j] = min(dp[i][j-1], max(dp[i-1][j-1], abs(a[i]-b[j])+abs(b[j]-p)))
3.贪心可以得到结论,取得n把钥匙一定是连续的,所以枚举连续的长度为n的区间,第一个人取该区间第一把钥匙,第二个取第二把...
二分代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 2005;ll a[maxn], b[maxn], n, k, p;bool judge(ll x){ int setp = 1; for(int i = 1; i <= n; i++) { while(setp <= k && abs(a[i]-b[setp])+abs(b[setp]-p) > x) setp++; if(setp > k) return 0; setp++; } return 1;}int main(void){ while(cin >> n >> k >> p) { for(int i = 1; i <= n; i++) scanf("%I64d", &a[i]); for(int i = 1; i <= k; i++) scanf("%I64d", &b[i]); sort(a+1, a+1+n); sort(b+1, b+1+k); ll ans, l = 0, r = 0x3f3f3f3f3f3f3f3f; while(l <= r) { ll mid = (l+r)/2;// cout << l << ' ' << r << endl; if(judge(mid)) ans = mid, r = mid-1; else l = mid+1; } printf("%I64d\n", ans); } return 0;}
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 2005;ll a[maxn], b[maxn], n, k, p;ll dp[maxn][maxn];int main(void){ while(cin >> n >> k >> p) { for(int i = 1; i <= n; i++) scanf("%I64d", &a[i]); for(int i = 1; i <= k; i++) scanf("%I64d", &b[i]); sort(a+1, a+1+n); sort(b+1, b+1+k); dp[0][0] = 0; for(int i = 1; i <= n; i++) for(int j = i; j <= k; j++) { if(i == j) dp[i][j] = max(dp[i-1][j-1], abs(a[i]-b[j])+abs(b[j]-p)); else dp[i][j] = min(dp[i][j-1], max(dp[i-1][j-1], abs(a[i]-b[j])+abs(b[j]-p))); } printf("%I64d\n", dp[n][k]); } return 0;}
阅读全文
1 0
- Codeforces Round #424 (Div. 2) D. Office Keys(贪心 二分 or DP)
- Codeforces Round #424 (Div. 2) D. Office Keys(dp)
- Codeforces Round #424 -(二分&贪心)||dp-D. Office Keys
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)D. Office Keys(二分+贪心)
- CF Round #424( Div.2) D. Office Keys 【二分||DP】
- Codeforces Round #424 D. Office Keys(二分)
- Codeforces Round #424 (Div. 2) D. Office Keys
- Codeforces Round #424 (Div. 2) Problem D. Office Keys
- CF Round #424( Div.2) D. Office Keys
- Codeforces 831D Office Keys 贪心or dp
- Codeforces 831D Office Keys 二分+贪心
- Codeforces Round #377 (Div. 2)D. Exams(二分+贪心)
- Codeforces Round #424 (Div. 2)C. Jury Marks 暴力 D. Office Keys 二分 E. Cards Sorting 树状数组
- Codeforces 831D Office Keys【Dp/二分】
- Codeforces Round #377 (Div. 2) D. Exams 二分+贪心 or 纯贪心水过
- Codeforces Round #276 (Div. 1)D(贪心+dp)
- Codeforces D. Office Keys 贪心(待证)
- Codeforces 831D Office Keys(思维or二分)
- python_爬虫入门
- MFC编程--定时器使用
- 多个img标签之间的间隔问题
- 1.实验 5.2.5 文件定位 用lseek()函数实现以下功能 1. 获取文件大小 2. 为文件添加指定长度的空洞 3. 在指定位置写入指定内容 4. 读出指定位置的内容 1. 获取文件大小
- JZ2440 start.S 分析1(arm920t)
- Codeforces Round #424 (Div. 2) D. Office Keys(贪心 二分 or DP)
- 3517: 翻硬币
- 实验 5.2.8 解锁/锁定文件 1. 实现对指定文件的锁定和解锁。 1. 实现对指定文件的锁定和解锁。
- bug的处理流程
- 异常安全编程
- Linux系统编程——线程同步与互斥:POSIX无名信号量
- Python3 爬虫--网页get和post
- 实验 5.2.8-3 对文件的任意部分加锁 1. 用 fcntl()对文件进行锁操作。 2. 完善课件中的示例程序,给出程序运行结果及分析。 给b.txt中的前10个字节加写锁
- 变态跳台阶