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 < t < 180),接下来t行每行有一个整数a (0 < a < 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 < x2 ≤ 31400, 0 ≤ y1 < 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 NO4
根据面积判断
正方形和矩形
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 < x2 ≤ 31400, 0 ≤ y1 < 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<= n <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