2016级ACM寒假训练(八)

来源:互联网 发布:鸡兔同笼用c语言编程 编辑:程序博客网 时间:2024/04/29 12:53

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 01 00 1-1 -1

Sample Output

0023

找规律 分情况讨论

#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 03 1 13 0 103 0 73 4 0

Sample Output

-115-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);else{if(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

3306090

Sample Output

NOYESYES

小学数学公式

#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

50 0 2 30 3 3 52 0 5 23 2 5 52 2 3 340 0 2 30 3 3 52 0 5 23 2 5 5

Sample Output

YESNO
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

50 0 2 30 3 3 52 0 5 23 2 5 52 2 3 340 0 2 30 3 3 52 0 5 23 2 5 5

Sample Output

YESNO
#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,给出序列中的一个值,计算下一个序列的值。序列如下:111211211111221

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;}



0 0