AtCoder 刷题

C - Distribution
题目链接
思路:3个数组间相互刷新,水题,但是一定要注意一点:
这是一个环!!!!!
所以从头是从2开始处理,然后再从1开始处理一遍

#include <bits/stdc++.h>
#define MAX 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
ll s[maxn], t[maxn];
ll dis[maxn];
int n;
int main(){
	cin >> n;
	for(int i=1; i<=n; i++) scanf("%lld",&s[i]);
	for(int i=1; i<=n; i++) scanf("%lld",&t[i]);
	for(int i=2; i<=n; i++){
		if(i==2){
			dis[2]=t[2];
			continue;
		}
		if(t[i]<dis[i-1]+s[i-1]) dis[i]=t[i];
		else dis[i]=dis[i-1]+s[i-1];
	}
	for(int i=1; i<=n; i++){
		if(i==1){
			if(t[1]<dis[n]+s[n]) dis[1]=t[1];
			else dis[1]=dis[n]+s[n];
			continue;
		}
		if(t[i]<dis[i-1]+s[i-1]) dis[i]=t[i];
		else dis[i]=dis[i-1]+s[i-1];
	}
	for(int i=1; i<=n; i++){
		printf("%lld\n",dis[i]);
	}
	return 0;
}

G - Reorder Cards
题目链接
思路:先找规律,然后发现行和列的处理互不影响,故可以分别处理,那么先将所有的行和列分开进行排序并处理,同时要注意记录输入时的顺序,灵活运用自定义排序即可。

#include <bits/stdc++.h>
#define MAX 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+10;
typedef long long ll;
//注意这里最好用一个struct,因为用2个可能会相同时顺序不一样
struct node{
	ll x, y;
	ll num;
	ll r, c;
}mp[maxn];
ll h, w, n;
ll g, d;
bool cmp1(node a, node b){
	return a.x<b.x;
}
bool cmp2(node a, node b){
	return a.y<b.y;
}
bool cmp3(node a, node b){
	return a.num<b.num;
}
int main(){
	cin >> h >> w >> n;
	for(int i=1; i<=n; i++){
		cin >> g >> d;
		mp[i].x=g, mp[i].y=d;
		mp[i].num=i;
	}
	sort(mp+1,mp+n+1,cmp1);
	mp[1].r=1;
	for(int i=2; i<=n; i++){
		if(mp[i].x==mp[i-1].x) mp[i].r=mp[i-1].r; //处理相同情况
		else mp[i].r=mp[i-1].r+1;
	}
	sort(mp+1,mp+n+1,cmp2);
	mp[1].c=1;
	for(int i=2; i<=n; i++){
		if(mp[i].y==mp[i-1].y) mp[i].c=mp[i-1].c;
		else mp[i].c=mp[i-1].c+1;
	}
	sort(mp+1,mp+1+n,cmp3);
	for(int i=1; i<=n; i++){
		printf("%lld %lld\n",mp[i].r,mp[i].c);
	}
	return 0;
}

H - Takahashi Tour
题目链接
思路:很明显dfs,用vector存储,先对每个点所连接边的编号进行预处理,让小的排前面,然后注意一下输出位置就好了,进去一个输出,不成功返回输出。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int vis[maxn];
vector <int> v[maxn];
int x, y;
void dfs(int u){
	printf("%d ",u);
	vis[u]=1;
	for(int i=0; i<v[u].size(); i++){
		int h=v[u][i];
		if(!vis[h]){
			dfs(h);
			printf("%d ",u);
		}
	}
}
int main(){
	int n;
	cin >> n;
	for(int i=1; i<n; i++){
		cin >> x >> y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	for(int i=1; i<=n; i++){
		sort(v[i].begin(),v[i].end());
	}
	dfs(1);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值