爱奇艺比赛-算法英雄复赛-writeup

最难的题目的难度和初赛第三题差不多,其他两题只不过是代码长了一些,令人感动……
手头有事,只扯关键点和贴代码了。
(为什么我编辑框里选了C/C++,可是高亮和缩进都丢了啊?令人感动)

A:2遍bfs就行了。
吐槽:似乎说了水能从高格子向低格子流,但是可流动的方向呢?我没太仔细读,没找到,于是默认当4向写,过了的……
如果能瞬移/8向流动就感人了……

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#include <ctype.h>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;

int n,m;
int a[105][105];
bool visa[105][105];
bool visb[105][105];

const int di[4][2]={{-1,0},{1,0},{0,1},{0,-1}};

struct Point{
	int x,y;
	Point(int a=0,int b=0):x(a),y(b){}
	Point go(int i){
		return Point(x+di[i][0],y+di[i][1]);
	}
	bool check(){
		return x>=1&&y>=1&&x<=n&&y<=m;
	}
};

void bfs(queue<Point>& q,bool vis[105][105]){
	while(!q.empty()){
		Point x=q.front();q.pop();
		for(int i=0;i<4;i++){
			Point y=x.go(i);
			if(y.check()&&(!x.check()||(x.check()&&a[x.x][x.y]<=a[y.x][y.y]))){
				if(vis[y.x][y.y])continue;
				vis[y.x][y.y]=1;
				q.push(y);
			}
		}
	}
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
		}
	}
	queue<Point> q;
	for(int i=1;i<=n;i++){
		q.push(Point(i,0));
	}
	for(int i=1;i<=m;i++){
		q.push(Point(n+1,i));
	}
	bfs(q,visa);
	
	while(!q.empty())q.pop();
	for(int i=1;i<=n;i++){
		q.push(Point(i,m+1));
	}
	for(int i=1;i<=m;i++){
		q.push(Point(0,i));
	}
	bfs(q,visb);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(visa[i][j]&&visb[i][j]){
				printf("%d %d\n",i-1,j-1);
			}
		}
	}
	return 0;
} 

B:单调栈的经典应用。之前什么陈利人的新浪微博发过,感兴趣可以去学一下。
数据范围有点意思,1e6个数,高度最高1e4,刚好爆int,开long long躲就行了。
写过才知道,说用个数据结构就行,那是不够的,有些细节你会犯错的。
内存限制10MB……然后开1e6*2的int数组MLE了……然后换成vector,就过了?黑人问号脸。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#include <ctype.h>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;

struct Pt{
	int x;
	int len;
};

int main(){
	int n;
	scanf("%d",&n);
	ll ans=0;
    vector<Pt> stk;
	for(int i=0;i<n;i++){
		Pt tmp;
		scanf("%d",&tmp.len);
		tmp.x=i;
		while(stk.size()>0&&stk[stk.size()-1].len>tmp.len){
			Pt& x=stk[stk.size()-1];
			ans=max(ans,(ll)(x.len)*(ll)(i-x.x));
			tmp.x=x.x;
			stk.pop_back();
		}
		stk.push_back(tmp);
	}
	for(int i=0;i<stk.size();i++){
		ans=max(ans,(ll)(stk[i].len)*(ll)(n-stk[i].x));
	}
	printf("%lld\n",ans);
	return 0;
} 

C:……为什么是按规则排序的题啊……
反正就是,写好比较规则,扔进set里去方便快速修改其中一个/找最小。
本来想考缓存系统+最近最少使用的那种平衡树+源数据表,相互之间指针指来指去吧?
……可是,10w的范围,用基于红黑树的set+数组下标就搞定了啊……
缓存区容量为0的时候有点坑,小心一点就行了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#include <ctype.h>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;

struct Record{
	int freq;
	int write_time;
	int id;
	bool operator<(const Record& b)const{
		if(freq!=b.freq)return freq<b.freq;
		return write_time<b.write_time;
	}
};

int pos[100001];
Record info[100001];
int d,q;

int get_num(int& a,int& b){
	char tmp[50];
	gets(tmp);
	return sscanf(tmp,"%d%d",&a,&b);
}

set<Record> s;

int query(int x){
	if(pos[x]!=-1){
		set<Record>::iterator it=s.find(info[x]);
		s.erase(it);
		info[x].freq++;
		s.insert(info[x]);
	}
	return pos[x];
}

void update(int x,int data,int write_time){
	if(d==0)return;
	if(pos[x]!=-1){
		pos[x]=data;
	}else{
		info[x].freq=0;
		info[x].id=x;
		info[x].write_time=write_time;
		pos[x]=data;
		if(s.size()>=d){
			set<Record>::iterator it=s.begin();
			int remove_id=it->id;
			pos[remove_id]=-1;
			s.erase(it);
		}
		s.insert(info[x]);
	}
}

int main(){
	memset(pos,-1,sizeof(pos));
	get_num(d,q);
	for(int i=0;i<q;i++){
		int a,b;
		int ret=get_num(a,b);
		if(ret==1){
			printf("%d\n",query(a));
		}else{
			update(a,b,i);
		}
	}
	return 0;
} 


全部评论
刚刚接到北京爱奇艺HR打来的电话了233333 可惜我6.3刚好毕设答辩,所以,就不去了,有些遗憾。
点赞 回复 分享
发布于 2017-05-23 13:49
第三题即使数据范围不是正负十万,用map代替数组,+set一起搞感觉也能过。。。
点赞 回复 分享
发布于 2017-05-22 01:54
很悬  榜啥时候能出来呀
点赞 回复 分享
发布于 2017-05-22 00:44
第一题不是记忆化搜索。?。
点赞 回复 分享
发布于 2017-05-21 23:13
感觉2.4是没希望了,全世界都是2.5
点赞 回复 分享
发布于 2017-05-21 23:13
你多少分??
点赞 回复 分享
发布于 2017-05-21 23:13
不懂多少分能过
点赞 回复 分享
发布于 2017-05-21 22:23

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
9937次浏览 92人参与
# 你的实习产出是真实的还是包装的? #
1779次浏览 41人参与
# 巨人网络春招 #
11307次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7494次浏览 43人参与
# 简历第一个项目做什么 #
31591次浏览 332人参与
# 重来一次,我还会选择这个专业吗 #
433398次浏览 3926人参与
# 米连集团26产品管培生项目 #
5799次浏览 214人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187025次浏览 1122人参与
# 牛客AI文生图 #
21414次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152310次浏览 887人参与
# 研究所笔面经互助 #
118882次浏览 577人参与
# 简历中的项目经历要怎么写? #
310120次浏览 4197人参与
# AI时代,哪些岗位最容易被淘汰 #
63489次浏览 806人参与
# 面试紧张时你会有什么表现? #
30490次浏览 188人参与
# 你今年的平均薪资是多少? #
213034次浏览 1039人参与
# 你怎么看待AI面试 #
179917次浏览 1237人参与
# 高学历就一定能找到好工作吗? #
64317次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76452次浏览 374人参与
# 我的求职精神状态 #
448008次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363299次浏览 2637人参与
# 腾讯音乐求职进展汇总 #
160600次浏览 1111人参与
# 校招笔试 #
470578次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务