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 ...
随机推荐
- 苹果MAC安装Windows系统
一,选择实用工具 二,选择分区助理 三,创建安装U盘或者安装 如没有安装U盘需要现创建一个,安装镜像需要事先准备好,制作好了安装U盘就选择第三项安装 四,为windows分区(建议分30G) 系统会格 ...
- Quick UDP Internet Connections 让互联网更快的协议,QUIC在腾讯的实践及性能优化
https://mp.weixin.qq.com/s/44ysXnVBUq_nJByMyX9n5A 让互联网更快:通往QUIC之路 原创: 史天 翻译 云技术实践 8月15日 QUIC(Quick U ...
- java并发深入
对象由数据+行为组成.数据就是字段,行为就是方法. 并发须要保证这些可被多个线程訪问的共享对象数据的完整性,以及某些特定完整性语义. 比方一个类有一个字段count=0,两个线程同一时候对它做加1操作 ...
- javascript 之 typeof 与 instanceof
1.typeof:返回一个表达式的数据类型的字符串 返回结果为js的数据类型,包括number,boolean,string,object,undefined,function. var a = 1; ...
- (2.1)备份与还原--sql server文件的概念及操作
概述:sql server是以文件形式存储数据与日志 1.数据文件 sql server数据文件分为2类 (1)主数据库文件 主数据库文件包含数据库的启动信息.系统对象,并指向数据库的其他文件(从数据 ...
- html5 live stream
一.传统的安防监控/流媒体音视频直播基本架构 A/V device 信号采集(yuv/rgb) ---> 转码(h264/265) ---> 网络推送(rtsp/rtmp/http/onv ...
- Spark SQL中UDF和UDAF
转载自:https://blog.csdn.net/u012297062/article/details/52227909 UDF: User Defined Function,用户自定义的函数,函数 ...
- 七、Mosquito 集群搭建
本章主要讲述Mosquitto 集群搭建的两种方式 1.进行双服务器搭建 2.进行多服务器搭建 一.Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理,但是我在查找资料 ...
- django 用户注册功能实现
增加views的类 class RegisterView(View): def get(self, request): return render(request, 'register.html', ...
- Android Studio Tips
1. 可以通过ctrl+shift+a,然后输入reformat,就能看到对应的快捷键. 如果记不得快捷键了,都可以通过ctrl+shift+a来查找. 2. [Androidstudio]的坑之[@ ...