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. 架构模式: API网关

    模式: API网关 上下文 让我们假设您正在构建一个使用Microservice体系结构模式的在线商店,并且您正在实现产品详细信息页面.您需要开发产品详细信息用户界面的多个版本: 用于桌面和移动浏览器 ...

  2. python手撸桌面计算器

    网上有一些许多关于计算器的源码,但我似乎不太care 一直寻思着自己手撸一个才有意思,于是这就开始了 实现功能: 1.基本的两个数 +-x÷ 运算以及取反,百分之,平方等 2.支持连续运算 3.暂不支 ...

  3. 通过SublimeCodeIntel设置JavaScript自动补全

    1.首先安装SublimeCodeIntel包. 进入sublime,通过Ctrl+Shift+P进入包管理,输入pci(首字母),选择Package Contrl:Intall Package,如图 ...

  4. 剑指offer9:青蛙变态跳台阶,1,2,3……,n。

    1. 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 2. 思路和方法 每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后 ...

  5. Flask_入门

    django是个大而全的框架,flask是一个轻量级的框架. django内部为我们提供了非常多的组件:orm / session / cookie / admin / form / modelfor ...

  6. Leetcode 杂题

    盛最多水的容器   给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) ...

  7. lua与c的交互(运用)

    (1)lua程序 (2)C++程序(头文件) extern "C" {     #include "lua.h"     #include "lual ...

  8. Java HashMap、HashTable与ConCurrentHashMap

    一.Java中数据存储方式最底层的两种结构 1.数组:存储空间连续,寻址迅速,增删较慢.(代表:ArrayList) 2.链表:存储空间不连续,寻址慢,增删较快.(代表:LinkedList) 二.哈 ...

  9. div布局(持续更新)

    1. 效果: 代码: <!DOCTYPE html> <html> <head> <meta name="viewport" conten ...

  10. SNI功能在NetScaler上的实现

    SNI功能在NetScaler上的实现 来源  https://raynorli.com/2018/09/11/sni-on-netscaler/ 现网中经常是一台主机上运行多个Web站点,如果启用了 ...