总结

这是我无聊透顶肝到三点半的一场 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\) 两对数中有且只有一个数是相同的。

那么原问题就变成了:

  1. 判断每一组是否与另一边的每一组是否有且仅有一组匹配或者有多组匹配但相匹配的数值是相同的;
  2. 判断同一边的两组与另一边的组匹配的数是否相同

具体见代码吧...感觉这题还是非常奇怪...

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\) 个数对分组,要求:

  1. 一组最多有两个元素;
  2. \(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的更多相关文章

  1. Codeforces Round #488 Div. 1

    A:枚举每个点判断是否同时在两个正方形中即可. #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  2. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

  3. 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 ...

  4. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  5. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  6. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  7. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. think in java 手记(一)

    工作之余,不知道要做些什么.该做的事情都完成的差不多了,想看一下spring的东西,毕竟这些东西用的多.但是又想看一下关于javaee的东西,这个里面的设计模式多.想了一会儿,觉得这些无非都是工具,j ...

  2. 项目笔记---事半功倍之GhostDoc(二)

    前言 前一篇文章<项目笔记---事半功倍之StyleCop(一)>提到如何约束代码,规范代码风格,这一节,我们将了解如何快速生成符合规则的代码注释---GhostDoc 一.安装Ghost ...

  3. Alwayson--辅助副本状态

    1. 同步中(SYNCHRONIZING),主副本和辅助副本之间存在数据差异,并正在进行同步: 2. 已同步(SYNCHRONIZED),主副本和辅助副本之间不存在数据差异,无需要同步的日志: 3. ...

  4. C# 实现邮件代发

    由于自己很好奇,有一些推广之类的 邮件,发件人后面,都有一个 由 .... 代发. 所以,查找了一些资料,来验证了一下实现方法. 咱们先来看看,实现代发的 理想效果图 当然,这一种,是利用 代发的 邮 ...

  5. 程序媛计划——python初级课时3~5

    产生1-10中的随机数: for 循环:所有可遍历对象都能用于for循环,如一个字符串. len(list),list中的元素类型可以各不相同:可以直接用下标对list元素赋值来更新列表 对字符串可以 ...

  6. LayUI把表格中的时间戳改成格式化的时间

  7. linux parallel rsync 拷贝N多文件

    先来个对比图看一下, 左边图是普通 rsync 目录拷贝, 右边图是借助 parallel 工具并发起了多个 rsync centos6.5安装 parallel #!/bin/bash # Inst ...

  8. PHP之旅6 php的类与面向对象

    对于类与面向对象的问题其实刚开始不用非要弄懂原因,直接先这样用,用多了你就发现你会了.所以 学习面向对象就先去做.用的多了你就发现这个就是这样的. 对于类的理解,我自己的理解就是:有一个叫做类的东西里 ...

  9. Js验证15/18身份证

    var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古&quo ...

  10. jmeter报错

    1.检测服务性能是报超时时问题 解决:因为服务器限制只能域名访问不能用ip+端口访问,但是jmter使用的是IP+端口访问 如图: 所以需要服务器放开这个端口,改成可以使用这个IP+端口访问