hihoCoder太阁最新面经算法竞赛18

比赛链接:http://hihocoder.com/contest/hihointerview27/problems

A.Big Plus

模拟水

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 505;
 5 int n;
 6 char G[maxn][maxn];
 7
 8 bool ok(int x, int y) {
 9     return x >= 0 && x < n && y >= 0 && y < n;
10 }
11 int check(int x, int y) {
12     int s = 0;
13     while(ok(x,y-s)&&ok(x,y+s)&&ok(x-s,y)&&ok(x+s,y)&&G[x+s][y]&&G[x-s][y]&&G[x][y+s]&&G[x][y-s]) s++;
14     return s - 1;
15 }
16
17 int main() {
18     // freopen("in", "r", stdin);
19     memset(G, 0, sizeof(G));
20     while(~scanf("%d", &n)) {
21         for(int i = 0; i < n; i++) {
22             scanf("%s", G[i]);
23         }
24         for(int i = 0; i < n; i++) {
25             for(int j = 0; j < n; j++) {
26                 G[i][j] -= ‘0‘;
27             }
28         }
29         int ret = 0;
30         for(int i = 0; i < n; i++) {
31             for(int j = 0; j < n; j++) {
32                 if(G[i][j] == 1) {
33                     ret = max(ret, check(i, j));
34                 }
35             }
36         }
37         printf("%d\n", ret);
38     }
39     return 0;
40 }

B.Interval Coverage

初始的目标是[x,y],结束的目标应当是[y,y]: 因为排好序了的,所以先二分,找到一个区间[l,r],使得r尽可能大,并且l不超过x,找到了这么一个l,位置的下标为pos。 那么,现在就需要在排号序后下标为[1,pos]的r中选择最远的,由于用st表预处理了这个东西,所以直接O(1)可以得到最远的r=t(是值)。 其实就不需要关注这个t对应的那条线段是谁了,反正已经符合条件了,那么就更新x=t就行了,目标变成了[t,y]。讨论区的意思是还有O(n)的解法。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef struct Node {
 5     int s, t;
 6 }Node;
 7 const int maxn = 100100;
 8 int n, x, y;
 9 Node p[maxn];
10
11 int dp[maxn][20];
12 int a[maxn], b[maxn];
13
14 bool cmp(Node a, Node b) {
15     if(a.s == b.s) return a.t < b.t;
16     return a.s < b.s;
17 }
18
19 void st() {
20     for(int i = 1; i <= n; i++) dp[i][0] = b[i];
21     int k = int(log(n+1.0)/log(2.0));
22     for(int j = 1; j <= k; j++) {
23         for(int i = 1; i + (1 << j) - 1 <= n; i++) {
24             dp[i][j] = max(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
25         }
26     }
27 }
28
29 int query(int l, int r) {
30     int k = int(log(r-l+1.0)/log(2.0));
31     return max(dp[l][k], dp[r-(1<<k)+1][k]);
32 }
33
34 int bs(int lo, int hi, int x) {
35     int pos;
36     while(lo <= hi) {
37         int mid = (lo + hi) >> 1;
38         if(a[mid] <= x) {
39             pos = mid;
40             lo = mid + 1;
41         }
42         else hi = mid - 1;
43     }
44     return pos;
45 }
46
47 int main() {
48     // freopen("in", "r", stdin);
49     while(~scanf("%d%d%d",&n,&x,&y)) {
50         for(int i = 1; i <= n; i++) {
51             scanf("%d%d",&p[i].s,&p[i].t);
52         }
53         sort(p+1, p+n+1, cmp);
54         for(int i = 1; i <= n; i++) {
55             a[i] = p[i].s;
56             b[i] = p[i].t;
57         }
58         st();
59         int ret = 0;
60         bool flag = 0;
61         while(x < y) {
62             int pos = bs(1, n, x);
63             int t = query(1, pos);
64             if(x == t) {
65                 flag = 1;
66                 break;
67             }
68             x = t;
69             ret++;
70         }
71         if(flag) puts("-1");
72         else printf("%d\n", ret);
73     }
74     return 0;
75 }

C.Split Array

题意仅仅是要求分成的小数组里有且仅有k个数字并且连续。那么从头到尾扫一边,每一次都提出一个数字就行了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 100500;
 5 int n, m, k, a;
 6 int cnt[maxn];
 7
 8 int main() {
 9     // freopen("in", "r", stdin);
10     int T;
11     scanf("%d", &T);
12     while(T--) {
13         scanf("%d%d",&n,&k);
14         memset(cnt, 0, sizeof(cnt));
15         m = 0;
16         for(int i = 1; i <= n; i++) {
17             scanf("%d", &a);
18             cnt[a]++;
19             m = max(m, a);
20         }
21         bool flag = 0;
22         for(int i = 1; i <= m; i++) {
23             if(flag == 1) break;
24             if(cnt[i] > 0) {
25                 while(cnt[i] > 0) {
26                     for(int j = i; j < i + k; j++) {
27                         if(cnt[j] > 0) cnt[j]--;
28                         else {
29                             flag = 1;
30                             break;
31                         }
32                     }
33                 }
34             }
35         }
36         if(flag) puts("NO");
37         else puts("YES");
38     }
39     return 0;
40 }
时间: 2024-10-11 08:42:00

hihoCoder太阁最新面经算法竞赛18的相关文章

Hihocoder 太阁最新面经算法竞赛18

Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus 描述 Given an NxN 01 matrix, find the biggest plus (+) consisting of 1s in the matrix. size 1 plus size 2 plus size 3 plus size 4 plus 1 1 1 1 111 1 1

hihoCoder太阁最新面经算法竞赛19

比赛链接:http://hihocoder.com/contest/hihointerview28/problems A. 固定一个方向,两两相邻的点顺时针或逆时针构造三个向量,判断这个点在这个向量的左侧还是右侧,看看是否在同一侧.trick就是点在向量上,对应的情况就是值为0. 1 def do(p1x, p1y, p2x, p2y, p3x, p3y): 2 return (p3x - p1x) * (p2y - p1y) - (p2x - p1x) * (p3y - p1y); 3 4 T

[HIHO]hihoCoder太阁最新面经算法竞赛7

题目链接:http://hihocoder.com/contest/hihointerview12 期末完事了,终于有时间成套刷题了.这套题比较简单,难度上感觉和上一套差不多.除了最后一个题是看了讨论版说数据水才敢写的. A Word Construction 解法:正解应该是dfs+剪枝,我的思路是贪心,竟然过了.先把字符串按字典序排序,然后枚举每一个串作为起始,记下串内有什么字符,再从头到尾枚举所有字符串,看看每一个是否符合条件.就那么100个字符串,数据弱得很. 1 #include <a

hihoCoder太阁最新面经算法竞赛15

Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 Long long ago you took a crazy trip around the world. You can not remember which cities did you start and finish the trip.  Luckily you

hihoCoder太阁最新面经算法竞赛2

A  任务分配 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务. 同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行.任务切换不需要时间. 输入 第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目. 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si < Ei ≤ 1000000000),表示任务的起至时间. 输出 输出一个整数,表示最

zz 圣诞丨太阁所有的免费算法视频资料整理

首发于 太阁实验室 关注专栏 写文章 圣诞丨太阁所有的免费算法视频资料整理 Ray Cao· 12 小时前 感谢大家一年以来对太阁实验室的支持,我们特地整理了在过去一年中我们所有的原创算法类视频,均为免费观看,方便大家学习. 先放一个ACM大神讲解的算法题视频(国外传优酷真的是太不容易了……). ACM大神精讲北美最新面试题—在线播放—优酷网,视频高清在线观看http://v.youku.com/v_show/id_XMTg2ODk0MzIwMA==.html 其余视频: [公开课]ACM大神精

算法竞赛专题解析(1):二分法、三分法

目录 1. 二分法的理论背景 2. 整数二分模板 2.1 基本形式 2.2 STL的lower_bound()和upper_bound() 2.3 简单例题 3. 整数二分典型题目 3.1 最大值最小化(最大值尽量小 3.1.1序列划分问题 3.1.2 通往奥格瑞玛的道路 3.2 最小值最大化(最小值尽量大) 4. 实数二分 4.1 基本形式 4.2 实数二分例题 5. 二分法习题 6. 三分法求极值 6.1 原理 6.2 实数三分 6.2.1 实数三分习题 6.3 整数三分 本系列是这本算法教

[算法竞赛入门]第二章_循环结构程序设计

第2章 循环结构程序设计 [学习内容相关章节] 2.1for循环 2.2循环结构程序设计 2.3文件操作 2.4小结与习题 [学习目标] (1)掌握for循环的使用方法: (2)掌握while循环的使用方法: (3)学会使用计算器和累加器: (4)学会用输出中间结果的方法调试: (5)学会用计时函数测试程序效率: (6)学会用重定向的方式读写文件: (7)学会fopen的方式读写文件: (8)了解算法竞赛对文件读写方式和命名的严格性: (9)记住变量在赋值之前的值是不确定的: (10)学会使用条

深度学习攻防对抗(JCAI-19 阿里巴巴人工智能对抗算法竞赛)

最近在参加IJCAI-19阿里巴巴人工智能对抗算法竞赛(点击了解),初赛刚刚结束,防御第23名,目标攻击和无目标攻击出了点小问题,成绩不太好都是50多名,由于找不到队友,只好一个人跟一群大佬PK,双拳难敌四手,差点自闭放弃比赛了.由于知道对抗攻击的人很少,于是抽空写篇博客,简单科普一下人工智能与信息安全的交叉前沿研究领域:深度学习攻防对抗. 然后简单介绍一下IJCAI-19 阿里巴巴人工智能对抗算法竞赛 目前,人脸识别.自动驾驶.刷脸支付.抓捕逃犯.美颜直播……人工智能与实体经济深度结合,彻底改