暑期个人赛--第八场--A
2014-07-30 18:11
204 查看
A. 游戏 2014新生暑假个人排位赛08
时间限制 1000 ms 内存限制 65536
KB
小弱发明了一个好玩的游戏,游戏开始时给你一个凸多边形,这个多边形可以任意旋转,平移。让你造出一个正方形“容器”(足够大),容器的两边垂直,两边水平。用这个容器把这个多边形完全包含,且多边形有且只有一条边恰好与容器下边界重合(与外界相通),不同的边与外界相通代表不同的方案。现在让你判断是否有方案可以让这个多边形能够不掉下来。不掉下来要求是至少有一条边与容器之间存在压力(假设摩擦系数无穷大)。
如下图,左边会掉下来,右边不会掉下来。
有多组数据。
对于每组数据,第一行是多边形点数n(3 <= n <= 1000),后面n行分别是这些点沿着多边形逆时针的二维坐标(xi, yi)(xi,yi的绝对值 <= 1000,输入数据精度精确到两位)。
对每组数据输出有多少种方案可以使多边形不掉下来。
赛中提交:一次AC
题目大意:
看题目描述
思路:
如果某个角是钝角,那么分别以他的两边作为贴合的边时,就会有两个方案
所以只要计算出一共有几个钝角,再解决重复计算的问题即可
下面是AC代码:
时间限制 1000 ms 内存限制 65536
KB
题目描述
小弱发明了一个好玩的游戏,游戏开始时给你一个凸多边形,这个多边形可以任意旋转,平移。让你造出一个正方形“容器”(足够大),容器的两边垂直,两边水平。用这个容器把这个多边形完全包含,且多边形有且只有一条边恰好与容器下边界重合(与外界相通),不同的边与外界相通代表不同的方案。现在让你判断是否有方案可以让这个多边形能够不掉下来。不掉下来要求是至少有一条边与容器之间存在压力(假设摩擦系数无穷大)。如下图,左边会掉下来,右边不会掉下来。
输入格式
有多组数据。对于每组数据,第一行是多边形点数n(3 <= n <= 1000),后面n行分别是这些点沿着多边形逆时针的二维坐标(xi, yi)(xi,yi的绝对值 <= 1000,输入数据精度精确到两位)。
输出格式
对每组数据输出有多少种方案可以使多边形不掉下来。
输入样例
3 0.00 0.00 2.00 0.00 1.00 1.00 3 0.00 0.00 1.00 0.00 2.00 1.00 4 0.00 0.00 4.00 0.00 3.00 2.00 1.00 2.00
输出样例
0 2 3
赛中提交:一次AC
题目大意:
看题目描述
思路:
如果某个角是钝角,那么分别以他的两边作为贴合的边时,就会有两个方案
所以只要计算出一共有几个钝角,再解决重复计算的问题即可
下面是AC代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string> #include <vector> #include <list> #include <map> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <numeric> #include <functional> #define maxn 1006 using namespace std; struct P{ double x,y; }; P p[maxn]; bool big[maxn]; double point(double x1,double y1,double x2,double y2) { return x1*x2+y1*y2; } int main() { int n; while(scanf("%d",&n)!=EOF){ memset(big,false,sizeof(big)); for(int i=0;i<n;i+=1){ scanf("%lf %lf",&p[i].x,&p[i].y); } int num=0; for(int i=0;i<n-2;i+=1){ if(point(p[i].x-p[i+1].x,p[i].y-p[i+1].y,p[i+2].x-p[i+1].x,p[i+2].y-p[i+1].y)<0){ //钝角 big[i+1]=true; //标记 num+=2; if(big[i]){ //如果上一个角也是钝角则减一 num-=1; } } } if(point(p[n-2].x-p[n-1].x,p[n-2].y-p[n-1].y,p[0].x-p[n-1].x,p[0].y-p[n-1].y)<0){ //特判n-1,钝角 big[n-1]=true; //标记 num+=2; if(big[n-2]){ //如果上一个角也是钝角则减一 num-=1; } } if(point(p[n-1].x-p[0].x,p[n-1].y-p[0].y,p[1].x-p[0].x,p[1].y-p[0].y)<0){ //特判0,钝角 big[0]=true; //标记 num+=2; if(big[n-1]){ //如果上一个角也是钝角则减一 num-=1; } if(big[1]){ //如果上一个角也是钝角则减一 num-=1; } } printf("%d\n",num); } return 0; }
相关文章推荐
- 暑期个人赛--第八场--B(关于手写队列的启示+题目有坑)
- (待切,标记上)暑期个人赛--第八场--E
- 暑期个人赛--第八场--C(自己坑自己~!!!!)
- 暑期个人赛--第八场--D
- 2017暑期ACM俱乐部个人训练赛第3场
- 2017暑期ACM俱乐部个人训练赛第2场
- 2017暑期ACM俱乐部个人训练赛第5场 G.礼物 (矩阵快速幂)
- 暑期个人赛--第三场--A
- 暑期培训计划之个人计划
- 2014暑期最后一次个人赛
- 暑期个人赛--第三场--C
- 暑期个人赛第二场
- 2013 - ECJTU 暑期训练赛第八场-problem-A
- HPU-ACM暑期培训第2周14级个人赛:Problem E HDU 4883
- 暑期个人赛--第一场--E
- 暑期个人赛--第二场--D--every SG(重)
- 2013 - ECJTU 暑期训练赛第八场-problem-B
- 暑期个人赛--第二场--C
- 2014/08/2 暑期个人赛二(每周)
- 暑期个人赛--第十一场--E