校训练赛WFU14_4


 A - Lesha and array splitting

题意:给你一个数组,把它分成几个子数组,每个子数组的和不能为0,可以分成一个即原数组。
思路:如果原数组全为0,则输出NO,如果原数组的和不为0,就输出第一个元素和最后一个元素的下标。如果原数组和不为0,就输出两个数组。分别是第一个子数组恰好和不为0 的时候,另一个是剩下的时候。
AC代码:
#include <stdio.h>  
int main(void)  
{  
    int n;  
    scanf("%d", &n);  
	int a[n]; 
    int pos = 0;
	int sum = 0;  
    for (int i = 1; i <= n; i++)  
    {  
        scanf("%d", &a[i]);  
        sum += a[i];  
        if (a[i] != 0 && pos == 0)  
            pos = i;  
    }  
    if (pos == 0)  
    {  
        printf("NO\n"); 
        return 0;
    }  
    printf("YES\n"); 
    if (sum == 0)  
    {
       printf("2\n");
	   printf("%d %d\n",1,pos);
	   printf("%d %d\n",pos+1,n);	
    }
    else  
    {
    	printf("1\n");
    	printf("%d %d\n",1,n);
    }    
    return 0;  
}  

                                            B - Ilya and tic-tac-toe game

题意:类似于五子棋,给你棋盘,问你在上下左右对角线在下一枚棋子,问是否能形成三个连续的x。
思路:按层按列按对角线查找满足条件的情况。
AC代码:
#include<stdio.h>  
char field[4][4];
int dfs(int i,int j)  
{  
   	   
    for (i = 0;i < 4;i++)  
    {  
        for (j = 0;j <= 1;j++)  
        {  
            if (field[i][j] == 'x' && field[i][j + 1] == 'x' && field[i][j + 2] == 'x')  
            {  
                return 1;  
            }  
        }  
    } //每层进行查找   
    for (i = 0; i <= 1; i++)  
    {  
        for (j = 0;j < 4;j++)  
        {  
            if (field[i][j] == 'x' && field[i+1][j] == 'x' && field[i+2][j] == 'x')  
            {  
                return 1;  
            }  
        }  
    }  //每列进行查找 
    for (i = 0;i <= 1;i++)  
    {  
        for (j = 0;j <= 1;j++)  
        {  
            if (field[i][j] == 'x' && field[i + 1][j + 1] == 'x' && field[i + 2][j + 2] == 'x')  
            {  
                return 1;  
            }  
        }  
    }  //次对角线 
    for (i = 0;i <= 1;i++)  
    {  
        for (j = 2;j < 4;j++)  
        {  
            if (field[i][j] == 'x' && field[i + 1][j - 1] == 'x' && field[i + 2][j - 2] == 'x')  
            {  
                return 1;  
            }  
        }  
    }  //主对角线 
    return 0;  
}  
  
int main(void)  
{  
    for (int i = 0;i < 4;i++)  
    	scanf("%s",field[i]);  
    for (int i = 0;i < 4;i++)  
    {  
        for (int j = 0;j < 4;j++)  
        {  
            if (field[i][j] == '.')  
            {  
                field[i][j] = 'x'; 
                if (dfs(i,j))  
                {  
                    printf("YES\n");  
                    return 0;  
                }  
                field[i][j] = '.';  
            }  
        }  
    }  
    printf("NO\n");  
    return 0;  
} 

C - Bachgold Problem

题意:给你一个大于1的自然数,将其表示为最大可能素数的和的长度。例如:6 = 2+2+2;还可以6 = 3+3;但是3个2的长度大于两个3的长度所以输出3.
思路:因为2是最小的质数,所以偶数除以2得到的结果就是最大长度。奇数的话例如7,7/2==3这时候7 == 2+2+2+1,因为1既不是质数也不是合数,所以不行,为了保证长度最小,只能加最小的数这时7==2+2+3,满足题意。综上无论奇偶最大长度一定时n/2,奇数的话少一个2加一个3.
AC代码:
#include<stdio.h>
int main(void)
{
	int n;
	scanf("%d",&n);
	if(n%2==0)
	{
		printf("%d\n",n/2);	
		for(int i = 0; i < n/2-1; i++)
			printf("%d ",2);
		printf("2\n");
	}	
	else
	{
		printf("%d\n",n/2);
		for(int i = 0; i < n/2-1; i++)
			printf("%d ",2);
		printf("3\n");
	}
	return 0;
} 

D - Parallelogram is Back

题意:给你三个点,求第四个点让其形成平行四边形。
思路:思路很广这道题,可以用面积,也可以用长度。这里我用向量。高中数学题,具体看代码吧。
AC代码:
#include<stdio.h>
int main(void)
{
	int a1,a2;
	int b1,b2;
	int c1,c2;
	scanf("%d%d",&a1,&a2);
	scanf("%d%d",&b1,&b2);
	scanf("%d%d",&c1,&c2);
	printf("%d\n",3);
	printf("%d %d\n",c1+b1-a1,c2+b2-a2);
	printf("%d %d\n",c1-b1+a1,c2-b2+a2);
	printf("%d %d\n",a1+b1-c1,a2+b2-c2);
	
	
	return 0;
}

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告