codeforces&集训队比赛——第一场

前言
本次比赛是集训队转换训练方式后的第一场比赛,由于赛场时间较短,而且题面是英文题,所以打的不尽人意,于是想着补题加深印象。
题目来源:Codeforces Round #600 (Div. 2)
题目链接http://codeforces.com/problemset/problem/1253

目录

A - Single Push
B - Silly Mistake
C - Sweets Eating
D - Harmonious Graph
E - Antenna Coverage
F - Cheap Robot

正文

A - Single Push

#include<iostream>
#include<cstdio>
#include<stack>
#define int long long
#define sc(x) scanf("%lld",&x)
using namespace std;
const int maxn=10001;
signed main(){
	int t;
	sc(t);
	while(t--){
		int n,flag=0;
		sc(n);
		int a[maxn],b[maxn],c[maxn]={0};
		for(int i=0;i<n;i++) sc(a[i]);
		for(int i=0;i<n;i++){
			sc(b[i]);
			c[i]=b[i]-a[i];
			if(c[i]<0) flag=1;
		}
		int l=0,r=n-1;
		while(c[l]==0) l++;
		while(c[r]==0) r--;
		int t=c[l];
		for(int i=l+1;i<=r;i++){
			if(c[i]!=t){
				flag=1;
				break;
			}
		}
		if(flag==1) printf("NO\n");
		else printf("YES\n");
	}
	return 0;
}

B - Silly Mistake

#include<iostream>
using namespace std;
const int maxn=1e3+10;
#include<set>
int n,arr[maxn],k=0;
set<int> s,v;
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		int x;
		scanf("%d",&x); 
		if(!s.size()) k++,v.clear();
		if(x>0&&!v.count(x)&&!s.count(x)) v.insert(x),s.insert(x); 
		else if(x<0&&s.count(-x)) s.erase(-x);
		else goto loop;
		arr[k]++;
	}
	if(s.size()){
		loop:printf("-1\n"); 
		return 0;
	}
	printf("%d\n",k);
	for(int i=1;i<=k;i++){
		printf("%d ",arr[i]);
	}
	return 0;
} 

C - Sweets Eating

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int maxn=200010;
signed main(){
	int n,m,a[maxn],sum[maxn];
	scanf("%lld%lld",&n,&m);
	fill(sum,sum+n,0);
	for(int i=0;i<n;i++) scanf("%lld",&a[i]);
	sort(a,a+n);
	for(int i=m;i<n;i++) sum[i]=sum[i-m]+a[i-m];
	int t=0;
	for(int i=0;i<n;i++){
		int ans=a[i]+sum[i]+t;
		printf("%lld ",ans);
		t=ans;
	} 
	return 0;
} 

D - Harmonious Graph

/*
通过并查集来合并每个集合 
*/
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 2e5+10;
int par[maxn];
int find(int x){
	return par[x]==x?x:par[x]=find(par[x]);
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) par[i]=i;
	while(m--){
		int x,y;
		scanf("%d%d",&x,&y);
		int nx=find(x),ny=find(y);
		if(nx>ny) par[ny]=nx;
		else par[nx]=ny;
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		int now=find(i);
		while(i<now){
			int ni=find(i);
			if(ni!=now){
				if(now<ni) swap(ni,now);
				par[ni]=now;
				ans++;
			}
			i++;
		}
	}
	printf("%d",ans);
    return 0;
}
//第二种方法 
/*
我们首先要找到当前连通块中最大的那个点,
也就是说所有小于当前点的点都要和这个点相连,
如果不相连的话,加一条边,
所以用我们可以用一个mark数组来标记当前当前点是否在当前联通块中,
如不在的话,并且当前点的大小小于联通块的最大点的大小,
我们就要加一条边。可以用dfs来遍历联通块
*/
/*
#include<bits/stdc++.h>
using namespace std;
const int N=2E5+7;
vector<int >ve[N];
int mark[N];
int s=0;
void dfs(int x){
    mark[x]=1;
    s=max(s,x);
    for(int i=0;i<ve[x].size();i++){
        int a=ve[x][i];
        if(!mark[a]) dfs(a);
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    int x,y;
    for(int i=1;i<=m;i++) {
        cin>>x>>y;
        ve[x].push_back(y);
        ve[y].push_back(x);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(mark[i]) continue ;
        if(i<s){
            ve[i].push_back(s);
            ve[s].push_back(i);
            ans++;
        }
        dfs(i);
    }
    cout<<ans<<endl;
    return 0;
}
*/ 

E - Antenna Coverage

#include<bits/stdc++.h>
#define maxn 200010
using namespace std;

int n, m, dp[maxn], s[88], x[88];	//dp[i]表示覆盖到i位置所需的最小花费
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&s[i]);
	for(int i=1;i<=m;i++) dp[i]=i;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(i>=x[j]) dp[i]=min(dp[i],dp[max(2*x[j]-i-1,0)]+max(i-s[j]-x[j],0));
			else dp[i]=min(dp[i],dp[max(x[j]-s[j]-1,0)]);
		}
	}
	printf("%d",dp[m]);
	return 0;
}

F - Cheap Robot

施工中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值