[Codeforces Round#488]Div.2
总结
这是我无聊透顶肝到三点半的一场 cf ,结果还真够无聊的
这套题涵盖了英语题,语文题,模拟题。注重考查了选手的英语素养能力,语文阅读能力和精湛的模拟和枚举能力。是不可多得的一套好题。
没什么单独拿题写博客的必要,就组在一起写个博客。提供翻译造福人类。
A. Fingerprints
Description
给出长度为 \(n\) 的序列 \(A\) ,和大小为 \(m\) 的集合 \(B\) ,要求找到 \(A\) 中最长子序列使得只出现 \(B\) 中的元素。
\(1\leq n,m\leq 10\)
Solution
比较难,要用到数组。
Code
比较难,不会写。
B. Knights of a Polygonal Table
Description
给 \(n\) 个二元组 \((p_i,c_i)\) 。对于每个组 \(i\) ,求 \(p_j < p_i\) 中 \(c_j\) 前 \(k\) ( \(k\) 给定)大的二元组 \(j\) 的 \(c_j\) 的和。每个组输出答案 + \(c_i\) 。
\(1\leq n\leq 10^5\)
Solution
按 \(p\) 排序,扫过去,用小根堆维护前面的 \(k\) 大 \(c\) 值。
Code
比较难,要用到优先队列。
C. Two Squares
Description
给你两个正方形,一个与坐标轴平行,另一个斜 \(45^\circ\) 。求是否有公共部分。
|坐标| \(\leq 100\)
Solution
调 \(\text{PNPoly}\) 调了好久...结果后来发现坐标都是整数...
因为容易得到相交的坐标一定也是整数,直接模拟就好了,坐标范围不大,直接涂色。
Code
写得太丑了,就不给了。
D. Open Communication
Description
两个人分别拥有一对互异的正整数,数值介于 \(1\sim 9\) 之间,现在两个人分别给出 \(n,m\) 对互异的正整数(数值也介于 \(1\sim 9\) 之间),他们拥有的那对数在这 \(n\) 组或 \(m\) 组中,现在他们并不知道自己的数是哪对,唯一确定的信息是原来拥有的那对数有且只有一个数是两个人均有的。现在你想知道:是否能求出两人均有的数;如果你不能确定,判断这两个人互相能否确定。
\(1\leq n,m\leq 12\)
Solution
我不知道我题面讲清楚没有...
转化一下模型,我们假设 \(n\) 组中的数对 \(i\) 与 \(m\) 组中的数对 \(j\) 是匹配的但且仅当 \(i\) \(j\) 两对数中有且只有一个数是相同的。
那么原问题就变成了:
- 判断每一组是否与另一边的每一组是否有且仅有一组匹配或者有多组匹配但相匹配的数值是相同的;
- 判断同一边的两组与另一边的组匹配的数是否相同
具体见代码吧...感觉这题还是非常奇怪...
Code
#include <bits/stdc++.h>
using namespace std;
int n, m, a[20][2], b[20][2];
int common(int x, int y) {
int cnt = 0, ans;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
if (a[x][i] == b[y][j]) ++cnt, ans = a[x][i];
return cnt == 1 ? ans : 0;
}
void work() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d%d", &a[i][0], &a[i][1]);
for (int i = 1; i <= m; i++) scanf("%d%d", &b[i][0], &b[i][1]);
int ans = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
int x;
if (!(x = common(i, j))) continue;
for (int k = 1; k <= m; k++)
if (common(i, k) && common(i, k) != x) {puts("-1"); return; }
for (int k = 1; k <= n; k++)
if (common(k, j) && common(k, j) != x) {puts("-1"); return; }
if (!ans) ans = x;
else if (x != ans) {puts("0"); return; }
}
printf("%d\n", ans);
}
int main() {work(); return 0; }
E. Careful Maneuvering
Description
在数轴上有两组整点点集大小为 \(n,m\) ,每组点的横坐标相等,纵坐标不一定相等,且两组点横坐标非 \(0\) 且互为相反数。
现在要求在 \(x=0\) 这条直线上放两个点,使得最多的点关于两个点任意一个能与另一部分对称。找到这个最大值。
\(1\leq n,m\leq 60\) , |纵坐标| \(\leq 10000\)
Solution
我们将左右两边点的纵坐标相加,可以得到 \(n\times m\) 组值,这些值中相等的就代表这些点对关于同一个点对称。注意到点不是很多,我们考虑去枚举对称点,计算两个对称点有关的互异点对个数。可以用 \(bitset\) 来处理。
Code
#include <bits/stdc++.h>
using namespace std;
int n, m, a[100], b[100], s[4000], cnt;
bitset<130>c[40005];
void work() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), a[i] += 10000;
for (int i = 1; i <= m; i++) scanf("%d", &b[i]), b[i] += 10000;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
c[a[i]+b[j]][i] = 1, c[a[i]+b[j]][n+j] = 1, s[++cnt] = a[i]+b[j];
int ans = 0;
for (int i = 1; i <= cnt; i++)
for (int j = i; j <= cnt; j++)
ans = max(ans, int((c[s[i]]|c[s[j]]).count()));
printf("%d\n", ans);
}
int main() {work(); return 0; }
F. Compute Power
Description
给出 \(n\) 组数对,每组数对有两个参数 \(a,b\) ,现在要求为这 \(n\) 个数对分组,要求:
- 一组最多有两个元素;
- \(a\) 相同的两个数对不能放在同一组
记方案分成的组数为 \(x\) 。对于每组,该组也有两个参数 \(A,B\),是这一组中 \(a\) 最大的数对的 \(a,b\) (若组内只有一个元素,那么就是这个元素的 \(a,b\) )。
要求
\[\frac{\sum_{i=1}^x A_i}{\sum_{i=1}^x B_i}\]
最小,求这个最小值。
\(1\leq n\leq 50\)
Solution
套路题啊。
分数规划,我们二分答案。先按 \(a\) 从大到小排序,相同则按 \(b\) 从大到小排序。
记 \(f_{i,j}\) 为前 \(i\) 个数对分了 \(j\) 组的答案最小值。
因为不能将 \(a\) 相同的放在同一组,所以我们对于 \(a\) 相同的数对一起处理。
转移的话就是考虑这些 \(a\) 相同的数有几个新开一组,其余的就放在那些只有一个元素的组里面。
由贪心的思想,对于 \(a\) 相同时, \(b\) 越大的越偏向于让他新开一组,所以之前要按 \(b\) 从大到小排序,这样就可以用前缀和来优化。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll inf;
int n; ll f[65][65], sum[65];
struct tt {
ll a, b;
bool operator < (const tt &x) const {
return a == x.a ? b > x.b : a > x.a;
}
}p[65];
bool judge(ll mid) {
memset(f, 127, sizeof(f)); inf = f[0][0];
f[0][0] = 0;
for (int i = 1, loc; i <= n; i = loc+1) {
for (loc = i; p[loc+1].a == p[i].a; loc++);
sum[i-1] = 0;
for (int j = i; j <= loc; j++) sum[j] = sum[j-1]+p[j].b;
for (int j = 0; j <= n; j++) if (f[i-1][j] != inf) {
for (int k = max(0, (loc-i+1)-(2*j-(i-1))); k <= min(n-j, loc-i+1); k++) {
f[loc][j+k] = min(f[loc][j+k], f[i-1][j]+p[i].a*k-mid*(sum[i+k-1]-sum[i-1]));
}
}
}
for (int i = 0; i <= n; i++) if (f[n][i] <= 0) return true;
return false;
}
void work() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%I64d", &p[i].a), p[i].a *= 1000;
for (int i = 1; i <= n; i++) scanf("%I64d", &p[i].b);
sort(p+1, p+n+1);
ll l = 1, r = 1ll*100000000*1000, ans;
while (l <= r) {
ll mid = (l+r)>>1;
if (judge(mid)) r = mid-1, ans = mid;
else l = mid+1;
}
printf("%I64d\n", ans);
}
int main() {work(); return 0; }
[Codeforces Round#488]Div.2的更多相关文章
- Codeforces Round #488 Div. 1
A:枚举每个点判断是否同时在两个正方形中即可. #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- 【Codeforces】Round #488 (Div. 2) 总结
[Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
随机推荐
- python 检索一个目录下所有的txt文件,并把文件改为.log
检索一个目录及子目录下所有的txt文件,并把txt文件后缀改为log: import os f_path = r'C:\Users\PycharmProjects\mystudy\Testfolder ...
- c# readkey readline read 区别
Console.read().Console.readline().Console.readkey()和Console.Write.Console.Writeline()的区别 Console.rea ...
- ASP.NET Core 2 学习笔记(六)MVC
ASP.NET Core MVC跟ASP.NET MVC观念是一致的,使用上也没有什么太大的变化.之前的ASP.NET MVC把MVC及Web API的套件分开,但在ASP.NET Core中MVC及 ...
- 解决win10不显示coreldraw x4/5/6菜单栏
1.下载插件 https://pan.baidu.com/s/1nQ1kgUNSD7-9sjUbv5M6XA 复制链接下载插件 2.导入插件到工作区 3.设置工具栏显示 4.把工具栏拖动到菜单栏位置, ...
- 检查网卡是否支持 SR-IOV
[root@node1 ~]# lspci -nn | grep Eth 08:00.0 Ethernet controller [0200]: Intel Corporation I350 Giga ...
- leetcode 121. 买卖股票的最佳时机 JAVA
题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票 ...
- 网络请求 get 请求时, 如果参数中的字符带有+号
网络请求 get 请求时, 如果参数中的字符带有+号, 今天前端在调用我的API时, 发现有个参数一直没法通过我后台的验证, 但是在前端查看时, 该参数结构又没有什么异常, 又是一番查找, 直到在后端 ...
- 日志分析与splunk浅谈
难易程度:★★★ 阅读点:linux;python;web安全;日志分析; 文章作者:xiaoye 文章来源:i春秋 关键字:网络渗透技术 前言 linux下的日志分析对企业来说非常重要,对我们分析p ...
- Elasticsearch安装与环境配置
Elasticsearch安装与环境配置 确保机器上已经安装了jdk7以上版本 下载:官网下载地址:https://www.elastic.co/downloads/elasticsearch 将下载 ...
- IdentityServer4 密码模式实现
1. 修改 Config.cs using System.Collections; using System.Collections.Generic; using IdentityServer4.M ...