Codeforces Round #482 (Div. 2)前三题题解

题目链接:http://codeforces.com/contest/979

A题:

很简单的规律题,首先人数++,偶数就是n/2,奇数就是n,别忘了考虑n等于1的情况(惨遭hack)···

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll a;
	scanf("%lld",&a);
	a++;
	if(a==1)
	{
		printf("0\n");
	}
	else
	{
	if(a%2==0)
	printf("%lld\n",a/2);
	else
	printf("%lld\n",a);
    }
	return 0;
}

B题

ppt,然后fst。。。这道题坑点有点大。大致思路是贪心算法,变子串不如变字母更优,接着就是复杂的讨论了。值得一提的是第86组数据是一种很特殊的情况,aaaaa在n等于1是长度最大是3,也就是说当n等于1且字母全相同时,长度-1。

#include<bits/stdc++.h>
using namespace std;
char a[3][100010];
int num[3][100];
bool cmp(int x,int y)
{
	return x>y;
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<3;i++)
	{
		getchar();
		scanf("%s",a[i]);
	 } 
	 int len=strlen(a[0]);
	 for(int i=0;i<3;i++)
	 {
	 	for(int j=0;j<len;j++)
		 num[i][a[i][j]-'A']++;
	 }
	 sort(num[0],num[0]+100,cmp);
	 sort(num[1],num[1]+100,cmp);
	 sort(num[2],num[2]+100,cmp);
	 int max1=num[0][0];
	 int max2=num[1][0];
	 int max3=num[2][0];
	 	 int bu1=len-max1;
	 	 int bu2=len-max2;
	 	 int bu3=len-max3;
	 	 int shi1,shi2,shi3;
	 	 if(bu1>=n)
	 	 shi1=max1+n;
	 	 else
	 	 {
	 	     if(len==1)
	 	     {
	 	     	 shi1=len;
			  }
			  else
			  {
			     if(bu1==0&&n==1) 
			     shi1=len-1;
			     else
			     shi1=len;
			  }
		 }
	 	 if(bu2>=n)
	 	 shi2=max2+n;
	 	 else
	 	 {
	 	     if(len==1)
	 	     {
	 	     	 shi2=len;
			  }
			  else
			  {
			     if(bu2==0&&n==1) 
			     shi2=len-1;
			     else
			     shi2=len;
			  }
		 }
	 	 if(bu3>=n)
	 	 shi3=max3+n;
	 	 else
	 	 {
	 	     if(len==1)
	 	     {
	 	     	 shi3=len;
			  }
			  else
			  {
			     if(bu3==0&&n==1) 
			     shi3=len-1;
			     else
			     shi3=len;
			  }
		 }
		 if(shi1>shi2)
		 {
		 	 if(shi1>shi3)
		 	 printf("Kuro\n");
		 	 else if(shi1==shi3)
		 	  { 
		 	      printf("Draw\n");	  
			   }
			   else
			   {
			   	  printf("Katie\n");
			   }
		 }
		 else if(shi1==shi2)
		 {
		 	 if(shi1==shi3)
		 	 printf("Draw\n");
		 	 else if(shi1>shi3)
		 	 {
		 	    printf("Draw\n");
			 }
			 else
			 {
			 	printf("Katie\n");
			 }
		 }
		 else
		 {
		 	 if(shi1==shi3)
		 	 {
		 	 	printf("Shiro\n");
			  }
			  else if(shi1>shi3)
			  {
			  	  printf("Shiro\n");
			  }
			  else
			  {
			  	  if(shi2==shi3)
			  	  {
			  	  	 printf("Draw\n");
				  }
				  else if(shi2>shi3)
				  {
				  	 printf("Shiro\n");;
				  }
				  else
				  {
				  	 printf("Katie\n");
				  }
			  }
		 }
	return 0;
}

C题

比赛时想的很复杂,一直没做出来,后来看了聚聚们的题解,懂了。

若a表示x一侧的节点数,b表示y一侧的节点数,则答案就是n*(n-1)-a*b(显然)。实现过程不难,看代码即可,其实就是两个dfs。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> g[300010];  
bool used[300010];
int pre[300010];
int x,y,n;
ll cnt;
void dfspath(int s,int e)
{
	used[s]=1;
	for(int i=0;i<g[s].size();i++)
	{
	    if(g[s][i]==e)
	    {
	    	pre[g[s][i]]=s;
			continue;
		}
		if(!used[g[s][i]])
		{
		    pre[g[s][i]]=s;
		    dfspath(g[s][i],e);
		}		    
	}
    return ;
}
void dfsnum(int s)
{
	cnt++;
	for(int i=0;i<g[s].size();i++)
	{
		if(!used[g[s][i]])
		{
			used[g[s][i]]=1;
			dfsnum(g[s][i]);
		}
	}
	return ;
}
int main()
{
    scanf("%d%d%d",&n,&x,&y);
	int t1,t2;
	for(int i=0;i<n-1;i++)
	{
		scanf("%d%d",&t1,&t2);
		g[t1].push_back(t2);
		g[t2].push_back(t1);
	}
	if(n==1)
	printf("0\n");
	else
	{
		pre[x]=-1;
		dfspath(x,y);
		memset(used,0,sizeof(used));
		for(int i=y;i!=x;i=pre[i])
		used[i]=1;
		used[x]=1;
		cnt=0;
		dfsnum(x);
		ll n1=cnt;
		cnt=0;
		dfsnum(y);
		ll n2=cnt;
		printf("%lld\n",(ll)n*(ll)(n-1)-n1*n2);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/star_moon0309/article/details/80374114
今日推荐