A 略 B 略

C:

先对Ai数列预处理前缀和 然后把Bi的每个都加一次 最终得到的结果为ans[sum]++; 最后如果有一个ans[sum]>=k即满足所有K个条件就输出(注意!!前缀和要进行unique操作!!!因为可能会有+1 -1 +1这种出现

#include <bits/stdc++.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#define foror(i,a,b) for(i=a;i<b;i++)
#define foror2(i,a,b) for(i=a;i>b;i--)
#define EPS 1.0e-6
#define PI acos(-1.0)
#define INF 3000000000
#define MOD 1000000009
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define lson o<<1, l, m
#define rson o<<1|1, m+1, r
//using ll = long long;
//using ull= unsigned long long;
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que;
typedef long long ll;
map<int,int> mp;
stack<int> s;
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int n,k;
int ans;
cin >> n >> k;
int a[n+],b[k+];
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]=a[i-]+a[i];
}
for(int i=;i<=k;i++)
{
scanf("%d",&b[i]);
}
sort(a+,a++n);
int lenth=unique(a+,a++n)-(a+);
for(int i=;i<=k;i++)
{
for(int j=;j<=lenth;j++)
{
s.push(b[i]]+a[j]);
mp[b[i]]+a[j]]++;
}
}
for(int i=;i<s.size();i++)
{
if(mp[s[i]>=k)
{
ans++;
mp[s[i]]=;
}
}
cout<<ans<<endl;
return ;
}

D:

二分或者DP

二分:由于要尽可能使每个人拿到距离自己最近的钥匙,我们先把所有人根据位置排序,把所有钥匙根据位置排序,然后二分答案,判断某一个值是否满足条件,具体判断过程见代码,每次尽量取左边的钥匙。

#include <cstdio>
#include <map>
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--) typedef long long ll;
const int maxn= ;
const int mod = ;
const int INF = 0x3f3f3f3f;
const double eps = 1e-; int n,k,p;
ll a[maxn];
ll b[maxn];
bool vis[maxn]; bool judge(ll limit)
{
int num=;
mst(vis,);
for(int i=;i<k;i++)
for(int j=;j<n;j++)
{
if(vis[j]) continue;
if(abs(b[i]-a[j])+abs(b[i]-p)<=limit)
{
vis[j]=true;
num++;
break;
}
}
return num==n;
} int main()
{
scanf("%d%d%d",&n,&k,&p);
for(int i=;i<n;i++)
{
scanf("%I64d",&a[i]);
}
for(int i=;i<k;i++)
{
scanf("%I64d",&b[i]);
}
sort(a,a+n);
sort(b,b+k);
ll l=,r=2e9+;
ll ans;
while(l<=r)
{
ll m=(l+r)/;
if(judge(m))
{
r=m-;
ans=m;
}
else l=m+;
}
printf("%I64d\n",ans);
return ;
}

DP:

用dp[i][j]表示前i个人在前j把钥匙中都拿到了钥匙并到达公司的最短时间。(所有人最短时间里的最大值)

可以写出状态转移方程:dp[i][j]=min(dp[i][j-1],max(dp[i-1][j-1]+abs(pos[j]-p)))   最终结果便是dp[n][k].

#include <cstdio>
#include <map>
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
#define mst(a,b) memset((a),(b),sizeof(a))
#define rush() int T;scanf("%I64d",&T);while(T--) typedef long long ll;
const int maxn= ;
const int mod = ;
const ll INF = 1e15;
const double eps = 1e-; int n,k;
ll p;
ll a[maxn];
ll b[maxn];
ll dp[maxn][maxn]; int main()
{
scanf("%d%d%I64d",&n,&k,&p);
for(int i=;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
for(int i=;i<=k;i++)
{
scanf("%I64d",&b[i]);
}
sort(a+,a++n);
sort(b+,b++k);
mst(dp,);
for(int i=;i<=n;i++)
for(int j=i;j<=k;j++)
{
if(i==j)
dp[i][j]=max(dp[i-][j-],abs(a[i]-b[j])+abs(b[j]-p)); //由j>=i,故i==j时特判
else dp[i][j]=min(dp[i][j-],max(dp[i-][j-],abs(a[i]-b[j])+abs(b[j]-p)));
}
printf("%I64d\n",dp[n][k]);
return ;
}

Codeforce Round #424的更多相关文章

  1. Codeforce Round #643 #645 #646 (Div2)

    codeforce Round #643 #645 #646 div2 Round #643 problem A #include<bits/stdc++.h> using namespa ...

  2. CodeForce Round#49 untitled (Hdu 5339)

    Untitled Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  3. Codeforce Round #216 Div2

    e,还是写一下这次的codeforce吧...庆祝这个月的开始,看自己有能,b到什么样! cf的第二题,脑抽的交了错两次后过了pretest然后system的挂了..脑子里还有自己要挂的感觉,果然回头 ...

  4. Codeforce Round #228 Div2

    这次的A题没注意要到100- -, B题没做,后来做要注意下1和long long C题当时坑的一B,用了个蠢办法,后来还错了,现在改了,还是蠢办法,等等再去用dp吧,而且本来就只有01用个鸡巴的树状 ...

  5. Codeforce Round #227 Div2

    这回的看错时间了! 发现理论可以涨分的- -

  6. Codeforce Round #226 Div2

    这次CF虽然,但是- - 第一题看了很久的题目意思额,虽然慢了点- -,但还算没出错,还学会了hack了- -,还+了100- - 第二题想了很久- -...后来发现可以暴力- -,哎 第三题本来也应 ...

  7. Codeforce Round #225 Div2

    这回的C- -,弄逆序,我以为要弄个正的和反的,没想到是等价的,弄两个还是正确的,结果我又没注意1和0只能指1个方向,结果弄了4个,取了4个的最小值就错了,自己作死没弄出来...,后面又玩去了...哎 ...

  8. Codeforce Round #224 Div2

    一下子没打,这比赛,就被虐成狗!

  9. Codeforce Round #222 Div2

    这场断网,本来有个别人的比较卡的无线 但后面睡着了- -! C:额,逆向想下! B:... A:...

随机推荐

  1. prometheus 的promsql的经典例子 安装grafana

    0.好的参考文档 https://www.cnblogs.com/longcnblogs/p/9620733.html 1.多维度数据 2.Prometheus的全局监控指标 只需要定义一个全局的指标 ...

  2. Linux 文件和目录的属性及权限

    一.Linux中的文件 1.1文件属性概述 Linux里一切皆文件! Linux系统中的文件或目录的属性主要包括;索引节点(inode).文件类型.权限属性.链接数.所归属的用户组.最近修改时间等内容 ...

  3. 选择排序的Python代码实现

    对于a[0]~a[n]的数组, 默认a[i]最小,和后面的a[i+1]~a[n]进行比较,把最小的和a[i]交换位置,保证本次循环结束后a[i]是上一次未排序的数据中最小的 写法1 a=[12,2,2 ...

  4. [转帖]利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞

    利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞 2018年08月02日 10:06:03 Minza 阅读数 483 https://blog.csdn.net/ha ...

  5. Linux系列(0):入门之Linux版本说明以及用户登录与切换

    你知道你登录时所在目录吗? 知道根目录下有哪些子目录吗? 知道如何切换用户吗? 知道如何添加用户吗? 如果你不知道,那就可以了解一下本章节啦! 前言:你知道Linux有多少发行版吗,如下图所示: 1. ...

  6. 石子合并(直线版+环形版)&(朴素写法+四边形优化+GarsiaWachs算法)

    石子合并-直线版 (点击此处查看题目) 朴素写法 最简单常见的写法就是通过枚举分割点,求出每个区间合并的最小花费,从而得到整个区间的最小花费,时间复杂度为O(n^3),核心代码如下: ; i < ...

  7. c++学习笔记之函数重载和模板理解

    1.函数重载: C++ 不允许变量重名,但是允许多个函数取相同的名字,只要参数表不同即可,这叫作函数的重载(其英文是 overload).重载就是装载多种东西的意思,即同一个事物能完成不同功能. 所谓 ...

  8. layui时间显示

    第一次使用layui框架吧!记录layui踩到的坑! 个人洁癖,不太喜欢显示时分秒. 最后终于找到解决方案了! 代码如下: {field: 'ctime',title: '时间',templet:&q ...

  9. Symfony4框架中单元测试和接口测试中的一些小坑

    前提说明: symfony 版本 4.1.*,使用  composer create-project symfony/website-skeleton  进行安装. 目标:在一个单元测试用例中对当前工 ...

  10. 17-Perl 目录操作

    1.Perl 目录操作以下列出了一些操作目录的标准函数:opendir DIRHANDLE, EXPR # 打开目录readdir DIRHANDLE # 读取目录rewinddir DIRHANDL ...