AtCoder ABC335 A-E题解

比赛链接:ABC335

Problem A:

签到题。我签签签签——

#include <bits/stdc++.h>
using namespace std;
int main(){
	string str;
	cin>>str;
	str[str.size()]='4';
	cout<<str<<endl;
	return 0;
}

Problem B:

又双叒叕是签到题。于是我签签签签——

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	for(int x=0;x<=n;x++){
		for(int y=0;x+y<=n;y++){
			for(int z=0;x+y+z<=n;z++)
				cout<<x<<' '<<y<<' '<<z;
		}
	}
	return 0;
}

Problem D:

注:先讲D是因为C>D(个人向)。

水题。就是打印螺旋矩阵。

#include <bits/stdc++.h>
using namespace std;
int grid[50][50];
int main(){
	int n;
	cin>>n;
    int r=0,c=0;
    int num=1;
    int tmp=n;
    grid[0][0]=num;
    for(int i=0;i<(n-1)/2;i++){
        for(;c<tmp-1;c++)
            grid[r][c]=num++;
        for(;r<tmp-1;r++)
            grid[r][c]=num++;
        for(c=tmp-1;c>i;c--)
            grid[r][c]=num++;
        for(r=tmp-1;r>i;r--)
            grid[r][c]=num++;
        tmp--;
        r++;
        num--;
    }
    for(int i=0;i<n;i++){
    	for(int j=0;j<n;j++){
    		cout<<grid[i][j]<<' ';
		cout<<endl;
	}
	return 0;
}

Problem C:

这题有一点点难度(也许是我太菜,我赛时TLE了,悲)。在网上康到了一种新奇思路,就是龙每动一下,就加一个头,砍掉一截尾巴。然后龙用deque维护。代码如下:

#include <bits/stdc++.h>
using namespace std;
deque<pair<int,int>> dragon;
int main(){
	int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
		dragon.push_back({i,0});
    while(q--){
    	int op;
    	cin>>op;
    	if(op==1){
    		char c;
    		cin>>c;
    		int x=dragon.front().first;
			int y=dragon.front().second;
    		if(c=='R')
				x++;
    		if(c=='L')
				x--;
    		if(c=='U')
				y++;
    		if(c=='D')
				y--;
    		dragon.push_front({x,y});
    		dragon.pop_back();
		}
		else{
			int p;
			cin>>p;
			cout<<dragon[p-1].first<<dragon[p-1].second<<endl;
		}
	}
    return 0;
}

Problem E:

提供一种不一样的思路。既然不能下降,那就把权值一样的点压成一个点(并查集),然后重新建图,在新图上做记忆化搜索。放个代码(快过年了,博主心情不太好,所以就不挖坑了):

#include <bits/stdc++.h>
using namespace std;
const int maxn=1000005;
pair<int,int> graph[maxn];
int mem[maxn],a[maxn],parent[maxn];
int e[maxn],nxt[maxn],idx,head[maxn];
int find(int x){
	if(parent[x]!=x)
		parent[x]=find(parent[x]);
	return parent[x];
}
void add_edge(int a,int b){
	e[idx]=b;
	nxt[idx]=head[a];
	head[a]=idx++;
}
int dfs(int u){
	if(mem[u]!=-1)
		return mem[u];
	mem[u]=-1e9;
	for(int i=head[u];i!=-1;i=nxt[i]){
		int v=e[i];
		if(a[v]<a[u])
			mem[u]=max(mem[u],dfs(v)+1);
	}
	return mem[u];
}
int main(){
	int n,m;
	cin>>n>>m; 
	memset(head,-1,sizeof(head));
	memset(mem,-1,sizeof(mem));
	for(int i=1;i<=n;i++) {
	  	cin>>a[i];
	   	parent[i]=i;
	}
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		graph[i]=make_pair(u,v);
		if(a[u]==a[v])
			parent[find(v)]=find(u);
	}
	for(int i=1;i<=m;i++){
		int u=find(graph[i].first);
		int v=find(graph[i].second);
		if(u!=v){
			add_edge(u,v);
			add_edge(v,u);
		}
	}
	mem[find(1)]=1;
	int ans=dfs(find(n));
	cout<<max(0,ans)<<endl;
	return 0;
}

以上就是本期的全部内容了,下期更新Atcoder ABC336 A-D题解。

友情提醒:本期所有的代码都有问题,所以请不要无脑Ctrl C+Ctrl V

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值