2019 google kickstart round A
第一题:
n个人,每个人有一个对应的技能值s,现在要从n个人中选出p个人,使得他们的技能值相同。
显然,如果存在p个人的技能值是相同的,输出0就可以了。如果不存在,就要找出p个人,对他们进行训练,治他们的技能值相同。
训练一个小时,技能值增加1,只有一个教练,也就是只能同时训练一个 人。找出最佳的p个人的方案,输出最小的训练时间。
AC的代码:
#include <stdio.h>
#include <stdlib.h>
#include <algorithm> using namespace std;
int s[100010]; // skill score
long long int t[100010];
int e[100010]; int main()
{
int tg;
scanf("%d", &tg);
int n, p; int ca=1;
while(tg--) {
scanf("%d %d", &n, &p);
s[0] = 0;
for(int i=1; i<=n; i++) {
scanf("%d", &s[i]);
}
sort(s+1, s+n+1); t[0] = 0;
for(int i=1; i<=n; i++) {
t[i] = t[i-1] + s[i];
} for(int i=p; i<=n; i++) {
e[i] = t[i] - t[i-p];
} int ans = s[p]*p - e[p];
int cur; for(int i=p; i<=n; i++) {
cur = s[i]*p - e[i];
if(cur < ans)
ans = cur;
}
printf("Case #%d: %d\n", ca, ans);
ca++;
}
return 0;
}
第二题:
每次给你一个R*C的矩阵,矩阵的元素不是1就是0。1代表此处是一个邮局,0代表此处一个邮局,或者理解成是一个需要邮寄的用户。
我们最多可以在某个为0的节点上再建立一个邮局,要输出的是每种方案中所有的用户到最近邮局的曼哈顿距离的最大值的最小值。
显然,如果矩阵中都是1,都是邮局,输出0就可以了(家门口就是邮局)。如果矩阵中存在0,显然“最多可以建一次邮局”的机会必
须要用上,再多建立一个邮局,一定可以减小或者不变当前邮局布局下的曼哈顿的最大值中的最小值。
那这个邮局选择在那个0的位置呢?最直接的方法就是枚举,枚举每个是0的位置,因为R和C的最大值是250。
但我写的代码貌似没过较大的数据量的case。第一次参加kickstart,每台搞明白。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <math.h> using namespace std; struct node
{
int x, y;
int w;
}cur; int main()
{
int tg;
scanf("%d", &tg);
int r, c;
int man_dis;
int ca=1;
vector<node>que1;
vector<node>que0; while(tg--) {
que0.clear();
que1.clear();
scanf("%d %d", &r, &c);
char q[300][300];
for(int i=1; i<=r; i++) { scanf("%s", q[i]);
for(int j=0; j<c; j++) {
cur.x = i;
cur.y = j+1;
if(q[i][j] == '1') {
que1.push_back(cur);
} else {
que0.push_back(cur);
}
}
} int ans1 = 0;
for(int i=0; i<que0.size(); i++) { int cur, mm=r+c+1;
for(int j=0; j<que1.size(); j++) {
cur = abs(que0[i].x - que1[j].x) + abs(que0[i].y - que1[j].y);
if(cur < mm)
mm = cur;
}
que0[i].w = mm;
if(mm > ans1)
ans1 = mm;
} // 找出所有普通节点的最小man距离, 找出这些距离里面的最大距离 if(que0.size() == 0) {
//
printf("Case #%d: 0\n", ca);
ca++;
} else { int ans2 = 0;
int ans = r+c+1; for(int i=0; i<que0.size(); i++) {
int x1 = que0[i].x;
int y1 = que0[i].y;
// 假设当前节点是邮局 更新最大的man距离
vector<int>mandis;
mandis.clear();
for(int j=0; j<que0.size(); j++) { int x2 = que0[j].x;
int y2 = que0[j].y; // int dis = abs(que0[i].x - que0[j].x) + abs(que0[i].y - que0[j].y);
int dis = abs(x1 - x2) + abs(y1 - y2); if(dis < que0[j].w) {
mandis.push_back(dis);
} else {
mandis.push_back(que0[j].w);
}
}
ans2 = 0;
for(int j=0; j<mandis.size(); j++) {
if(i!=j && mandis[j] > ans2)
ans2 = mandis[j];
}
if(ans2 < ans)
ans = ans2;
}
printf("Case #%d: %d\n", ca, ans);
ca++;
}
}
return 0;
}
第三题:
n个座位,编号1---n,现在有q个预定,每次预定都是(L, R),如(1, 3)表示预定了1、2、3的位置。
由于每次的座位预定可能会存在重复的座位预定而导致冲突,现在让你通过一种算法来实现保证每个预定的人
都能分到相同数量的k个座位,并保证这个k是最大的。没想到好的算法,故没有提交。(不过小数据量的情况下
暴力应该好过。依次枚举每个座位,轮流分给有预定的人)。
没有代码!
2019 google kickstart round A的更多相关文章
- google Kickstart Round G 2017 三道题题解
A题:给定A,N,P,计算A的N!次幂对P取模的结果. 数据范围: T次测试,1 ≤ T ≤ 100 1<=A,N,P<=105 快速幂一下就好了.O(nlogn). AC代码: #inc ...
- google Kickstart Round F 2017 四道题题解
Problem A. Kicksort 题意抽象一下为: 对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度. 数据范围: 测试组数1 ...
- Google Kickstart Round.B C. Diverse Subarray
这题又是万恶的线段树 maxx[j]存储的是 l = xxx, r = j的时候的答案 我们会让 l 从 1到n 的遍历中,查询线段树的[l, n]中最大的答案 因为query的下界是n,所以单次查询 ...
- Google Kickstart Round E 2018 B. Milk Tea
太蠢了,,,因为初始化大数据没过,丢了10分,纪念一下这个错误 大概思路:先求出让损失值最小的排列,由已生成的这些排列,通过更改某一个位置的值,生成下一个最优解,迭代最多生成m+1个最优解即可,遍历求 ...
- Google Kickstart在线测试规则以及注意事项
谷歌招聘在如火如荼的进行中,进谷歌都需要经过谷歌kickstart在线测试,然后过了之后还有五轮的面试- -.好吧毕竟你待遇高,你强你有理.. 下面介绍一下进谷歌的第一关google kickstar ...
- Google kickstart 2022 Round A题解
Speed Typing 题意概述 给出两个字符串I和P,问能否通过删除P中若干个字符得到I?如果能的话,需要删除字符的个数是多少? 数据规模 \[1≤|I|,|P|≤10^5 \] 双指针 设置两个 ...
- Kickstart Round H 2019 Problem B. Diagonal Puzzle
有史以来打得最差的一次kickstart竟然发生在winter camp出结果前的最后一次ks = = 感觉自己的winter camp要凉了 究其原因,无非自己太眼高手低,好好做B, C的小数据,也 ...
- google kickstart 2018 round D A Candies
思路: 对于small数据,由于求和及奇数数量两个限制条件均满足区间单调性,可以直接使用尺取法(滑动窗口法)求解. 对于large数据,奇数数量依然是满足区间单调性的.首先使用尺取法,找到所有满足奇数 ...
- [Google Codejam] Round 1A 2016 - The Last Word
[Problem Description] Problem On the game show The Last Word, the host begins a round by showing the ...
随机推荐
- poj1179 Polygon【区间DP】
Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions:6633 Accepted: 2834 Descriptio ...
- Nagle's algorithm
w41字节的数据包只有1字节的可用信息.以减少数据包发送量来提高TCP/IP网络性能. https://en.wikipedia.org/wiki/Nagle's_algorithm https:// ...
- Linux/Mac里复制终端Session(像SecureCRT一样)
在你的登录账户下的.ssh文件夹新建一个文件:config cd ~/.ssh config的文件中,内容为: host * ControlMaster auto ControlPath ~/.ssh ...
- requests和bs4
requests模块,仿造浏览器发送Http请求bs4主要对html或xml格式字符串解析成对象,使用find/find_all查找 text/attrs 爬取汽车之家 爬取汽车之家的资讯信息,它没有 ...
- 并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue
1.队列的使用: 队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁: 所以就出现了 队列 和 管道 都在内存中(快): 队列 = 管道 + 上锁 用队列的目的: 进程 ...
- TestLink安装手册
环境准备 系统CentOS Linux release 7.3.1611 (Core) 搭建LAMP所需的集成包 xampp-linux-x64-7.2.0-0-installer.run 下载地址 ...
- Mysql数据库常用操作语句大全
零.用户管理: 1.新建用户: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2.更改密码: >SET PASSWORD FOR name=PAS ...
- java 多线程 day12 读写锁
import java.util.Random;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent. ...
- jQuery异步加载数据并添加事件示例
当时项目是通过树形栏进行权限控制的,管理员可以对从数据库去的数据动态生成树形栏进行增删改查操作,可是用$(".XX").click();方法是不行的. 1.之前用的是jq1.4.3 ...
- ruby中的作用域
作用域(scope)指的是变量的可达性或可见性.不同类型的变量有不同的作用域规则.与self类似,作用域在程序的执行过程中也在不断的变化,也可以根据上下文推断出"谁在什么作用域中" ...