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. Windows To Go 制作详解

    拥有 Mac 的同学大概都会碰到一个头疼的问题,那就是使用 Windows 的使用需求.macOS 虽好,不过总是会有一些讨厌的软件没有 Mac 版本,这时就不得不在 Mac 上跑 Windows 了 ...

  2. jQuery代码书写规范

    1. 对于同一个对象不超过三个操作的,可以直接写成一行 $("li").show().unbind("click"); 2. 对于同一个对象的较多操作,建议每行 ...

  3. mysql对数据库的操作

    增: creae database 数据库名 create database 数据库名 character set utf8; 删: drop database 数据库名 改: alter datab ...

  4. idea的spring整合基于xml文件配置的mybatis报Invalid bound statement (not found): com.music.dao.MusicDao.findAll的问题

    一. 题主当时就是自己尝试整合spring和mybatis的时候遇到了这个问题,当时题主只看到了用注解的方式配置的dao层,题主用的是xml文件配置的形式, 而且坑爹的是题主的两个文件的路径写的也不一 ...

  5. 【转帖】k8s-kubectl命令大全

    https://www.cnblogs.com/fuyuteng/p/9458282.html 学习一下 Kubectl命令行管理对象 类型 命令 描述 基础命令 create 通过文件名或标准输入创 ...

  6. Eclipse中 coverage as 测试代码覆盖率

    eclipse 版本: Version: 2019-06 (4.12.0)Build id: 20190614-1200 绿色:代码被执行过黄色:代码部分被执行过红色:代码没有被执行过 引用: htt ...

  7. Java的四层结构dto、dao、service、controller

    首先,最底层的就是dto层,dto层就是所谓的model,dto中定义的是实体类,也就是.class文件,该文件中包含实体类的属性和对应属性的get.set方法:<bean> 其次,是da ...

  8. 写着玩的bash脚本

    #!/bin/bash function strealingManu { pwdfolder=`pwd` for var in "$@" do man 1 $var > $p ...

  9. PAT B1016.部分A+B(15)

    B1016.部分A+B(15) #include <cstdio> #include <cstring> int calc(long long a, long long da) ...

  10. MYSQL---触发器简单了解

    触发器 trigger 1.触发器是指事先为某张表绑定一段代码,当表中某些内容发生改变(增insert.删delete.改update)时,系统自动触发绑定的那段代码并执行.比如 一旦订单表里插入新订 ...