2020-2021 ACM-ICPC, Asia Seoul Regional Contest_组队训练

2020-2021 ACM-ICPC, Asia Seoul Regional Contest

B. Commemorative Dice

C. Dessert Café

E. Imprecise Computer

B. Commemorative Dice

 B题签到题,暴力找一遍就好了

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define ll long long int
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
int a[11],b[11];
int main()
{
	for(int i=1;i<=6;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=6;i++)
	{
		cin>>b[i];
	}
	int ans = 0;
	for(int i=1;i<=6;i++)
	{
		for(int j=1;j<=6;j++)
		{
			if(a[i]>b[j]) ans++;
		}
	}
	cout<<ans/(__gcd(ans,36))<<"/"<<36/(__gcd(ans,36));
 } 

 C. Dessert Café

题意:给你一棵树,里面有n个点,和n-1条边和边权,还有m个特殊点,如果存在一个候选地点z,其中公寓建筑群的位置使得每个候选地点q(≠p)的d(p,z)<d(q,z),则候选地点p是一个好地方。问这样的点有多少个?

题解:遍历一遍树,找出每两个特殊点之间有多少个点(包括他们自己),但不能重复,所以dfs一遍就好了。

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define ll long long int
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
int a[1001000];
vector<int>g[1000100];
bool vis[1000100];
bool visit[1000100];
int count1 = 0;
int dfs(int u)
{
    if(vis[u]) return 0;
    bool flag=0;
    vis[u]=1;
    for(int i=0;i<g[u].size();i++){
        if(vis[g[u][i]]) 
		{
			continue;
		}
        if(dfs(g[u][i])&&!flag)
		{
            if(!visit[u]) 
			{
				count1++;
			}
            flag=1;
        }
    }
    if(visit[u]||flag) return 1; 
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n-1;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a[i];
		visit[a[i]] = 1;
	}
	count1 = m;
	dfs(a[1]);
	cout<<count1<<endl;
	
 } 

 E. Imprecise Computer

题意:就是1-n之间数比大小,只有两个数之间相差大于等于2的时候才可以比较出大小,那么比如1可以大于2,2也可以大于1,都是成立的,现在叫你构造出两个数组,就是1-n之间的全比较,构造出大于i(i=1.2.3....n)的数构成的数组r1,r2,使满组给出的数组d[i]=abs(r1[i]-r2[i]);

题解:给一个波尔类型flag在遇到1时异或一下,但是在遇到的d[i]==2时flag状态必须为1,因为当为2时i和i-1,和i+1都是交换过的,所以必须为1,同时要满足flag最后要为0,并且d[i]必须小于等于2

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define ll long long int
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
int d[1000100];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>d[i];
	}
	bool flag = true;
	int flag1 = 0;
	for(int i=1;i<=n;i++)
	{
		if(d[i]>2) 
		{
			flag = false;
			break;
		}
		else{
			if(d[i]==1)
			{
				flag1 = 1 - flag1;
			}
			else if(d[i]==2)
			{
				if(flag1 == 0)
				{
					flag = false;
					break;
				}
			}
		}
	}
	if(flag&&!flag1)
	{
		puts("YES");
	}
	else{
		puts("NO");
	}
 } 

  

 

原文地址:https://www.cnblogs.com/lcsdsg/p/14340742.html