2016级ACM寒假训练

Posted MissZhou要努力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016级ACM寒假训练相关的知识,希望对你有一定的参考价值。

1

无限螺旋线

Problem:A

Time Limit:1000ms

Memory Limit:65536K

Description

平面坐标系上有一个无限的螺旋线。螺旋由线段组成,线段是  [(0, 0), (1, 0)], [(1, 0), (1, 1)], [(1, 1), ( - 1, 1)], [( - 1, 1), ( - 1,  - 1)], [( - 1,  - 1), (2,  - 1)], [(2,  - 1), (2, 2)] 等。
这个无限螺旋经过了平面上的所有整数点。
焕神住在平面上的坐标 (0,0),他想要沿着螺旋步行到点(x,y)。焕神认为转弯非常困难,因此他想知道从(0,0)沿螺旋步行到点(x,y)要转多少次弯。

Input

多组数据,每行包含两个整数 x 和 y ( |x|, |y| <= 100 )

Output

每组数据输出一个整数,表示焕神要转弯多少次。

Sample Input

0 0
1 0
0 1
-1 -1

Sample Output

0
0
2
3

找规律 分情况讨论

#include "stdio.h"
int main()

  int x,y,a,b,n;
  while(scanf("%d %d",&x,&y)!=-1)
  
  	if(y>x&&y>=-x&&y>0)n=4*y-2;
  	if(y<-x&&y>=x&&x<0)n=-4*x-1;
  	if(y<x&&y<=1-x&&y<=0)n=-4*y;
  	if(y>1-x&&y<=x&&x>=1)n=4*x-3;
  	if(x==0&&y==0)n=0;
  	printf("%d\\n",n);
  
  	return 0;
    	

2  依旧是找规律

跳房子

Problem:B

Time Limit:1000ms

Memory Limit:65536K

Description

有一种游戏叫做跳房子,游戏范围由正方形组成,数字从下到上,同一排从左到右填在格子里,如下图所示,从最下面开始每行的格子数1-1-2-1-2-1-2-(1-2)...这样重复下去。现在给你一个坐标系如图所示,正方形的边长为a。

烨神特别喜欢玩跳房子,有一天他突然想到一个问题,如果他往(x,y)点抛出一个石头,这个石头会不会正好落在格子里?如果会,那会落在哪一个格子里?
P.S这里指的是严格落在里面,落在边上不行

Input

输入数据有多组。每组输入只有三个整数a,x,y,a (1 ≤ a ≤ 100) 为正方形的边长,x,y ( - 106 ≤ x ≤ 106, 0 ≤ y ≤ 106) 为烨神抛出的石头的坐标。

Output

输出石头所在的格子号,如果不在格子里输出“-1”。(不含引号)

Sample Input

1 0 0
3 1 1
3 0 10
3 0 7
3 4 0

Sample Output

-1
1
5
-1
-1
#include "stdio.h"
int main()

	int a,x,y,l,a1,b1;float k;
	while(scanf("%d %d %d",&a,&x,&y)!=-1)
	
		l=y/a;k=a/2.0;
		if(l*a==y)printf("-1\\n");else
		if(l==0)
		
			if(x<k&&x>-k)printf("1\\n");
			else printf("-1\\n");
		
		else 
			a1=l/2;a1=a1*2;
			if(a1!=l)
			
			if(x<k&&x>-k)printf("%d\\n",3*(l-1)/2+2);
			else printf("-1\\n");
			
			else
				if(x>0&&x<a)printf("%d\\n",3*l/2+1);
				elseif(x<0&&x>-a)printf("%d\\n",3*l/2);
					else printf("-1\\n");return 0;
			

3

栅栏

Problem:C

Time Limit:1000ms

Memory Limit:65536K

Description

苟神想在他的农场周围围上一圈栅栏,但是他太懒了不想自己做,于是机智的苟神买了一个会围栅栏的机器人。
苟神想要一个正多边形的栅栏,但是机器人只会沿着直线走,然后转弯把栅栏的顶点围成一个特定的角度。
这时候问题就来了,机器人能不能围出苟神想要的栅栏呢?也就是说存不存在一个正多边形的顶点角度是a呢?

Input

输入数据有t组。第一行输入一个整数t (0 &lt; t &lt; 180),接下来t行每行有一个整数a (0 &lt; a &lt; 180)为机器人能围成的特定角度。

Output

如果能做出苟神想要的栅栏输出“YES”,否则输出“NO”。(不含引号)

Sample Input

3
30
60
90

Sample Output

NO
YES
YES

小学数学公式

#include <stdio.h>
#include <math.h>

int main()

    int x,n;
    scanf("%d",&n);
    while(n--)
    
        scanf("%d",&x);
        if(360%(180-x)==0)
            printf("YES\\n");
        else
            printf("NO\\n");

    

    return 0;

4

正方形和矩形

Problem:D

Time Limit:1000ms

Memory Limit:65536K

Description

韩大神有一个坐标系上面有n个矩形,每个矩形的顶点都在整数坐标上且边都平行于x轴和y轴,这些矩形可能共边但不会重叠。
他想知道这些矩形是否组成了一个正方形。

Input

输入数据有多组。第一行是一个整数n(1 ≤ n ≤ 5)。接下来n行每行有4个整数x1,y1,x2,y2 (0 ≤ x1 &lt; x2 ≤ 31400, 0 ≤ y1 &lt; y2 ≤ 31400) 来表示矩形的位置,(x1,y1)为矩形左下角坐标,(x2,y2)为矩形右上角坐标。没有矩形重叠,也就是说没有任何一个矩形的顶点在其他矩形内部。

Output

如果组成了一个正方形输出“YES”,否则输出“NO”。(不含引号)

Sample Input

5
0 0 2 3
0 3 3 5
2 0 5 2
3 2 5 5
2 2 3 3
4
0 0 2 3
0 3 3 5
2 0 5 2
3 2 5 5

Sample Output

YES
NO
4

根据面积判断

正方形和矩形

Problem:D

Time Limit:1000ms

Memory Limit:65536K

Description

韩大神有一个坐标系上面有n个矩形,每个矩形的顶点都在整数坐标上且边都平行于x轴和y轴,这些矩形可能共边但不会重叠。
他想知道这些矩形是否组成了一个正方形。

Input

输入数据有多组。第一行是一个整数n(1 ≤ n ≤ 5)。接下来n行每行有4个整数x1,y1,x2,y2 (0 ≤ x1 &lt; x2 ≤ 31400, 0 ≤ y1 &lt; y2 ≤ 31400) 来表示矩形的位置,(x1,y1)为矩形左下角坐标,(x2,y2)为矩形右上角坐标。没有矩形重叠,也就是说没有任何一个矩形的顶点在其他矩形内部。

Output

如果组成了一个正方形输出“YES”,否则输出“NO”。(不含引号)

Sample Input

5
0 0 2 3
0 3 3 5
2 0 5 2
3 2 5 5
2 2 3 3
4
0 0 2 3
0 3 3 5
2 0 5 2
3 2 5 5

Sample Output

YES
NO
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct juxing

     int x1,y1,x2,y2;
point[10];
int main()

  //  freopen("data.in.txt","r",stdin);
    //freopen("data.out.txt","w",stdout);
    int n,s,x,y,xmax,ymax,xmin,ymin;
    while(~scanf("%d",&n))
    
         s=0,xmax=0,ymax=0,xmin=31400,ymin=31400;
         for(int i=0;i<n;i++)
         scanf("%d%d%d%d",&point[i].x1,&point[i].y1,&point[i].x2,&point[i].y2);
         //sort(point,point+n,cmp);
         for(int i=0;i<n;i++)
         
              s+=(point[i].x2-point[i].x1)*(point[i].y2-point[i].y1);
              if(point[i].x1<xmin) xmin=point[i].x1;
              if(point[i].y1<ymin) ymin=point[i].y1;
              if(point[i].x2>xmax) xmax=point[i].x2;
              if(point[i].y2>ymax) ymax=point[i].y2;
         
         x=xmax-xmin;
         y=ymax-ymin;
         if(x==y&&s==x*y) printf("YES\\n");
         else printf("NO\\n");
    
    return 0;

5

陈宇的序列

Problem:E

Time Limit:1000ms

Memory Limit:65536K

Description

给出1个序列an,给出序列中的一个值,计算下一个序列的值。
序列如下:
1
11
21
1211
111221

Input

输入1个序列中的下标n,n(1&lt;= n &lt;10)

Output

对于序列中的an.  an要用long long

Sample Input

5

Sample Output

111221

Hint

智力题
1
11--- 表示前一个数“1”是 1 个 1;
21--- 表示前一个数“11”是 由 2 个 1 组成;
1211--- 表示前一个数“21”是 由 1 个 2、1 个 1 组成;
111221--- 即 11 12 21 ,表示前一个数“1211”是依次由 1 个 1,1 个 2,
2 个 1组成;
312211---即 31 22 11,表示前一个数“111221”是依次由 3 个 1,2 个 2,
1 个 1 组成;
所以,下一个数应填 13112221---即 13 11 22 21,表示前一个数“312211”是依次由 1 个 3,1 个 1,2 个 2,2 个 1 组成;
同理,再下一个数根据“13112221”填 1113213211,表示前一个数“13112221”是依次由 1 个 1,1 个 3,2 个 1,3 个 2,1 个 1 组成.

#include <iostream>

using namespace std;

int main()

    char a[10][50]="1","11","21","1211","111221","312211","13112221","1113213211","31131211131221","13211311123113112211";
    int n;
    while(scanf("%d",&n)!=EOF)
    
        printf("%s\\n",a[n-1]);
    
    return 0;



以上是关于2016级ACM寒假训练的主要内容,如果未能解决你的问题,请参考以下文章

ECJTU ACM18级队员寒假训练赛1 D题 HDU - 2181

ECJTU ACM18级队员寒假训练赛 D题 CodeForces 1033A

ACM2016级新生第三周训练赛

2018寒假 acm训练计划

NUC-ACM/ICPC 寒假训练 简单DP A - G题

ACM训练小结-柳志轩-2018年6月15日