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                1
     1              11111            1                1
                      1           1111111             1
                      1              1            111111111
                                     1                1
                                     1                1
                                                      1
                                                      1

输入

The first line contains an integer N. (1 <= N <= 500)

Then follow an NxN 01 matrix.

输出

The size of the biggest plus in the matrix.

样例输入5  
00100
00100
11111
00110
10101
样例输出  2
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 505;

int n, ans;
char mp[MAXN][MAXN];
int U[MAXN][MAXN], D[MAXN][MAXN], LEF[MAXN][MAXN], RIG[MAXN][MAXN]; 

int main(){
	int tmp;
	while(scanf("%d", &n) != EOF){
		for(int i=1; i<=n; ++i){
			getchar();
			for(int j=1; j<=n; ++j){
				scanf("%c", &mp[i][j]);
			}
		}
		memset(U, 0, sizeof(U)); memset(D, 0, sizeof(D));
		memset(LEF, 0, sizeof(LEF)); memset(RIG, 0, sizeof(RIG));
		for(int i=1; i<=n; ++i){
			for(int j=1; j<=n; ++j){
				if(mp[i][j] == ‘1‘){
					U[i][j] = U[i-1][j] + 1;
					LEF[i][j] = LEF[i][j-1] + 1;
				}
			}
		}
		for(int i=n; i>=1; --i){
			for(int j=n; j>=1; --j){
				if(mp[i][j] == ‘1‘){
					D[i][j] = D[i+1][j] + 1;
					RIG[i][j] = RIG[i][j+1] + 1;
				}
			}
		}
		ans = 0;
		for(int i=1; i<=n; ++i){
			for(int j=1; j<=n; ++j){
				if(mp[i][j] == ‘1‘){
					tmp = min(min(U[i][j], RIG[i][j]), min(D[i][j], LEF[i][j]));
					if(tmp-1 > ans){
						ans = tmp - 1;
					}
				}
			}
		}
		printf("%d\n", ans );
	}
	return 0;
}

  

题目2 : Interval Coverage

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

You are given N intervals [S1, T1], [S2, T2], [S3, T3], ... [SN, TN] and a range [X, Y]. Select minimum number of intervals to cover range [X, Y].

输入

The first line contains 3 integers N, X and Y. (1 <= N <= 100000, 1 <= X < Y <= 1000000)

The following N lines each contain 2 integers Si, Ti denoting an interval. (1 <= Si < Ti <= 1000000)

输出

Output the minimum number of intevals to cover range [X, Y] or -1 if it is impossible.

样例输入
5 1 5
1 2
1 3
2 4
3 5
4 5 
样例输出
2
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 100000 + 5;
struct Interval{
	int s, t;
}inte[MAXN];
int n, x, y;

int cmp(const void *a, const void *b){
	Interval *aa = (Interval *)a;
	Interval *bb = (Interval *)b;
	if(aa->s == bb->s){
		return aa->t - bb->t;
	}
	return aa->s - bb->s;
}
int main(){
	freopen("in.txt", "r", stdin); 

	int ans, far, start;
	while(scanf("%d %d %d", &n, &x, &y) != EOF){
		for(int i=0; i<n; ++i){
			scanf("%d %d", &inte[i].s, &inte[i].t);
		}
		qsort(inte, n, sizeof(inte[0]), cmp);
		if(inte[0].s > x){
			ans = -1;
		}else{
			far = max(x, inte[0].t);
			start = x;
			ans = 1;
			for(int i=0; i<n; ++i){
				if(far >= y){
					break;
				}
				if(inte[i].s <= start){
					far = max(far, inte[i].t);
				}else if(inte[i].s > far){
					break;
				}else{
					start = far;
					far = max(far, inte[i].t);
					++ans;
				}
			}
			if(far < y){
				ans = -1;
			}
		}
		printf("%d\n", ans );
	}
	return 0;
}

  

题目3 : Split Array

时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

You are given an sorted integer array A and an integer K. Can you split A into several sub-arrays that each sub-array has exactly K continuous increasing integers.

For example you can split {1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6}  into {1, 2, 3}, {1, 2, 3}, {3, 4, 5}, {4, 5, 6}.

输入

The first line contains an integer T denoting the number of test cases. (1 <= T <= 5)

Each test case takes 2 lines. The first line contains an integer N denoting the size of array A and an integer K. (1 <= N <= 50000, 1 <= K <= N)

The second line contains N integers denoting array A. (1 <= Ai <= 100000)

输出

For each test case output YES or NO in a separate line.

样例输入
2
12 3
1 1 2 2 3 3 3 4 4 5 5 6
12 4
1 1 2 2 3 3 3 4 4 5 5 6
样例输出
YES
NO
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 50000 + 5;
const int MAXV = 100000 + 5; 

int n, k, num[MAXV];
int main(){
	freopen("in.txt", "r", stdin); 

	int test_case, val, maxval, tmp, flag;
	scanf("%d", &test_case); 

	while(test_case--){
		scanf("%d %d", &n, &k);
		maxval = 0;
		memset(num, 0, sizeof(num));
		for(int i=0; i<n; ++i){
			scanf("%d", &val);
			num[val]++;
			maxval = max(maxval, val);
		}
		flag = 1;
		for(int i=1; i<=maxval; ++i){
			if(num[i] > 0){
				tmp = num[i];
				for(int j=0; j<k; ++j){
					num[i+j] -= tmp;
				}
			}else if(num[i] < 0){
				flag = 0;
				break;
			}
		}
		if(flag){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	return 0;
}

  

时间: 2024-10-11 20:12:42

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

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 &

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 阿里巴巴人工智能对抗算法竞赛 目前,人脸识别.自动驾驶.刷脸支付.抓捕逃犯.美颜直播……人工智能与实体经济深度结合,彻底改