2019 GDUT Rating Contest #III 5题解的综合

2019 GDUT Rating Contest #III 5篇题解

C. Team Tic Tac Toe

题目略解:

这题就是3*3的表格里需要找出成为一行,一列,对角线的大写字母组合,直接暴力即可,但是要注意细节,不能错过特例。

#include
#include
#include
#include
#include
using namespace std;
	char s[4][4];
	
bool can1()
{
	
	int j,k;

	for (j=0;j<=2;j++)
	
    if (s[j][0]!='.'&&s[j][1]!='.'&&s[j][2]!='.') return true;
    

    for (k=0;k<=2;k++)
    if (s[0][k]!='.'&&s[1][k]!='.'&&s[2][k]!='.') return true;

	if (s[0][0]!='.'&&s[1][1]!='.'&&s[2][2]!='.') return true;
	if (s[0][2]!='.'&&s[1][1]!='.'&&s[2][0]!='.') return true;
	
	return false;
}
bool can2()
{
	int j,k;
	for (j=0;j<=2;j++)
    if (s[j][0]!='.'&&s[j][1]!='.'&&s[j][2]!='.'&&(s[j][0]==s[j][1]&&s[j][1]==s[j][2])==false) return true;

    for (k=0;k<=2;k++)
    if ((s[0][k]!='.'&&s[1][k]!='.'&&s[2][k]!='.')&&(s[0][k]==s[1][k]&&s[1][k]==s[2][k])==false) return true;

	if ((s[0][0]!='.'&&s[1][1]!='.'&&s[2][2]!='.')&&(s[0][0]==s[1][1]&&s[1][1]==s[2][2])==false )return true;
	if ((s[0][2]!='.'&&s[1][1]!='.'&&s[2][0]!='.')&&(s[0][2]==s[1][1]&&s[1][1]==s[2][0])==false )return true;
	
	return false;
}
	
	
int main()
{

int i,j,k,a,b,ans1=0,ans2=0;

	scanf("%s",s[0]);
	scanf("%s",s[1]);
	scanf("%s",s[2]);

    char member[27][4][4];
    for (i=0;i<=25;i++)
    for (j=0;j<=2;j++)
    for (k=0;k<=2;k++)
     member[i][j][k]='.';
	for (i=0;i<=2;i++)
		for (j=0;j<=2;j++)
			member[s[i][j]-'A'][i][j]=s[i][j];	
	for (i=0;i<=25;i++)
	{
		
		for (j=0;j<=2;j++)
    		{
			
			for (k=0;k<=2;k++)
    		
				s[j][k]=member[i][j][k];
		    
			}
	    
		if (can1()) 
		ans1++;
       
	} 
	for (a=0;a<=25;a++)
	for (b=a;b<=25;b++)
	{
		for (j=0;j<=2;j++)
    		for (k=0;k<=2;k++)
				if (member[a][j][k]!='.') s[j][k]=member[a][j][k];else s[j][k]=member[b][j][k];
		if (can2()) 
		ans2++;
  		
	}
	printf("%d\n%d\n",ans1,ans2);
	return 0;
}

D. Lemonade Line

题目略解:

这题就是3*3的表格里需要找出成为一行,一列,对角线的大写字母组合,直接暴力即可,但是要注意细节,不能错过特例。

#include
#include
#include
#include
#include
using namespace std;
int main()
{
	int i,j,n,ans=0;
	int a[100005];
	scanf("%d",&n);

	for (i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(a+1,a+n+1);
	for (j=n;j>=1;j--)
	{
		if (a[j]>=ans)	ans++;
	 } 
	printf("%d\n",ans); 
	return 0;
}

A.Out of Sorts&&F.Out of Sorts II

题目略解:

这两题我好像双wa(哭),但是我赛后认真学习并理解了大佬的代码:
见:https://blog.csdn.net/qq_43333395/article/details/88544602
原来师兄讲的时候误了,我想了好长时间都没满带,后来问师兄发现了,原来只要先离散化,找到被动的元素,把他利用冒牌排序加上bit储存下来交换的位置倒推即可。(哭,当时只想了一半),以下是大佬的代码:
转载自上链接

#include 
#include 
#include 
#include 
#include 
#define INF 0x3f3f3f3f
using namespace std;

int n,sum[100006];//这里不能开100005,不然会wa
struct node{
 int id,x;
}a[100006];
bool cmp(const node&b,const node&c){
  if(b.x!=c.x)return b.x>n;
  memset(sum,0,sizeof(sum));
  for(int i=1;i<=n;i++){
    cin>>a[i].x;
    a[i].id=i;
  }
  sort(a+1,a+n+1,cmp);
  for(int i=1;i<=n;i++){
    add(a[i].id);
    ans=max(ans,i-querry(i));
  }
  cout<

A题较简单,就删去向右的大数操作即可,见https://blog.csdn.net/qq_43333395/article/details/88412339

E. Family Tree

题目略解:

这题我还是跪了,既然已经学习了,就再看看吧:
https://blog.csdn.net/qq_43333395/article/details/88412558

我讨厌树上作业!!!!我之前和队员讨论过伪树的数据结构,但是比赛的时候怎么敢写?
不过这题实际上是可以化简的,因为它数据较小,邻接表是容得下,但是如果数据较大,可以用前向星在线储存,同样是字符离散化,然后把下面这段改成sort即可。总之,这是道编程复杂度挺高的题。

#include 
#include 
#include 
#include 
#include 
#define INF 0x3f3f3f3f
using namespace std;
#define maxn 105
string f[maxn],cow[maxn];
int n;
string Find(string a){
  for(int i=1;i<=n;i++){
    if(a==cow[i]) return f[i];
  }
  return "";
}

int is(string a,string b){
  int cnt=0;
  while(b!=""){
     if(a==b) return cnt;
     b=Find(b);
     cnt++;
  }
  return -1;
}

int main(){
  string a,b;
  cin>>n>>a>>b;
  for(int i=1;i<=n;i++){
    cin>>f[i]>>cow[i];
  }
  string now=a;
  int cnta=0;
  while(now!=""){
    if(is(now,b)!=-1)
        break;
    now=Find(now);
     cnta++;
  }
  if(now==""){
    cout<<"NOT RELATED"<1&&cntb>1){
    cout<<"COUSINS"<1&&cntb==0)
            cout<<"grand-";
        if(cntb==0)
            cout<<"mother";
        else
            cout<<"aunt";
        cout<<" of "<

你可能感兴趣的:(题解)