PAT L3-012 水果忍者
占个坑,等自己数学好一点以后再来重新把这个题写一遍
附上链接
附上大牛代码:
#include <stdio.h>
#include <algorithm>
#define INF 99999999
#define ll long long
using namespace std;
struct line {
int x, y1, y2;//y1 > y2
}l[10005], id[10005];
//斜率存储
struct vec {
int x, y;
vec(int a = 0, int b = 0):x(a), y(b) {};
};
inline int cross(vec a, vec b) {//伪叉积,大于0就返回1,小于返回-1,等于返回0
ll temp = (ll)(a.x)*(ll)(b.y) - (ll)(a.y)*(ll)(b.x);
if (temp > 0) return 1;
else if (temp == 0) return 0;
return -1;
}
int n;
vec krmax, krmin, klmax, klmin;
inline bool cmp(const line& a, const line& b) {
return a.x < b.x;
}
inline bool cmp2(const line& a, const line& b) {
return (a.y1 - a.y2) < (b.y1 - b.y2);
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d%d", &l[i].x, &l[i].y1, &l[i].y2);
sort(l + 1, l + n + 1, cmp);//先根据x坐标从小到大排个序
for (int i = 1; i <= n; i++) {
id[i].x = i;//这里的x就是记录竖线ID了(即记录是从左到右的第几根竖线)
id[i].y1 = l[i].y1;
id[i].y2 = l[i].y2;
}
sort(id + 1, id + n + 1, cmp2);//再根据y1-y2从小到大排个序,优先尝试用“短”的竖线下方的端点作“卡子”
for (int idx = 1; idx <= n; idx++) {
int i = id[idx].x;//尝试以从左到右的第i根竖线下方的端点作“卡子”
krmax = vec(1, INF);
krmin = vec(1, -INF);
klmax = vec(-1, -INF);
klmin = vec(-1, INF);
for (int j = i + 1; j <= n; j++) {//向右找允许的最大斜率和最小斜率
vec v1(l[j].x - l[i].x, l[j].y1 - l[i].y2);
vec v2(l[j].x - l[i].x, l[j].y2 - l[i].y2);
if (cross(krmax, v1) < 0) krmax = v1;
if (cross(krmin, v2) > 0) krmin = v2;
}
for (int j = i - 1; j >= 1; j--) {//向左找允许的最大斜率和最小斜率
vec v1(l[j].x - l[i].x, l[j].y1 - l[i].y2);
vec v2(l[j].x - l[i].x, l[j].y2 - l[i].y2);
if (cross(klmin, v1) > 0) klmin = v1;
if (cross(klmax, v2) < 0) klmax = v2;
}
//判断以从左到右的第i根竖线下方的端点作“卡子”,是否可行,不可行直接continue
if (cross(krmax, krmin) > 0) continue;
if (cross(klmax, klmin) > 0) continue;
if (cross(krmax, klmin) < 0) continue;
if (cross(klmax, krmin) < 0) continue;
//可行,分情况讨论
if (cross(klmax, krmax) * cross(klmax, krmin) <= 0)
printf("%d %d %d %d", l[i].x + klmax.x, l[i].y2 + klmax.y, l[i].x, l[i].y2);
else if (cross(klmin, krmax) * cross(klmin, krmin) <= 0)
printf("%d %d %d %d", l[i].x + klmin.x, l[i].y2 + klmin.y, l[i].x, l[i].y2);
else if (cross(klmax, krmax) > 0 && cross(klmin, krmin) < 0)
printf("%d %d %d %d", l[i].x + krmax.x, l[i].y2 + krmax.y, l[i].x, l[i].y2);
else if (cross(krmax, klmax) > 0 && cross(krmin, klmin) < 0)
printf("%d %d %d %d", l[i].x + klmin.x, l[i].y2 + klmin.y, l[i].x, l[i].y2);
break;
}
return 0;
}
PAT L3-012 水果忍者的更多相关文章
- 前端优秀作品展示,JavaScript 版水果忍者
<水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 Rapha ...
- 作品展示,JavaScript 版水果忍者
点这里 <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 R ...
- 基于html5 canvas和js实现的水果忍者网页版
今天爱编程小编给大家分享一款基于html5 canvas和js实现的水果忍者网页版. <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版 ...
- L3-012 水果忍者 (30 分)
2010年风靡全球的“水果忍者”游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以完成游戏规定的任务. ...
- Cocos2d-x 水果忍者划痕效果
网上找的一个关于水果忍者划痕的,效果还算凑合.其原理就是基于OpenGL绘制直线,因为版本号过老,此处笔者改动了一些方法,粘贴后可直接使用 适用于Cocos2d-x 2.2.1 .h文件里须要添�的代 ...
- java游戏制作之水果忍者
水果忍者的原理很简单,主要就是采用随机的方式是画面上面出现水果. package Fruitninja; import java.awt.Dimension; import java.awt.Grap ...
- JavaScript实现的水果忍者游戏,支持鼠标操作
智能手机刚刚普及时,水果忍者这款小游戏可谓风靡一时.几年过去了,现在,让我们用纯JavaScript来实现这个水果忍者游戏,就算是为了锤炼我们的JavaScript开发技能吧. 大家可以通过这个链接在 ...
- 团体程序设计天梯赛(CCCC) L3012 水果忍者 上凸或下凹的证明
团体程序设计天梯赛代码.体现代码技巧,比赛技巧. https://github.com/congmingyige/cccc_code #include <cstdio> #include ...
- 团体程序设计天梯赛 L3-012. 水果忍者
/*对于一条满足条件的直线,向下移,直到触碰一条线段的下端点,仍然经过其它线段,该直线仍然满足条件 即以一条线段的下(上)端点作为直线上的一点,求为了经过一条线段的最小.最大斜率值(mink,maxk ...
随机推荐
- nodejs(三)下之mangoDB
mongoDB 简介 一.什么是MongoDB ? 1.MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. 2.Mo ...
- [报错] Xcode Error-Could not insert new outlet connection: Could not find any information for the class named "xxx"
当从StoryBoard或xib中需要将控件绑定类文件时(OC中是.m文件,Swift中是.swift文件) 当按住control键将控件往类文件中拖拽后,填写控件的name后,点击connect时 ...
- 【react读取文件】react发送GET请求读取静态文件
react中,使用发送请求的方式把static文件夹中的前端可访问的静态文件读取成字符串: 1.new request,需要用到getRequestHeaders组件 2.fetch获取respons ...
- 借助 Django 的 smart_str 和 smart_unicode 进行编码转换(转)
原文:http://www.dirk.sh/diary/using-django-smart_str-smart_unicode/ Django 为字符编码的转换提供了非常简洁的方法: 1.djang ...
- json中load和loads区别
相同点 dump 和 dumps 都实现了序列化 load 和 loads 都实现反序列化 变量从内存中变成可存储或传输的过程称之为序列化序列化是将对象状态转化为可保存或可传输格式的过程. 变量内容从 ...
- 如何在python项目中写出像Django中一样功能的settings
一 核心文件目录结构 二 实现代码 resdme: 在实现此功能主要用到的知识点及模块: 1.反射 3.内置方法dir # 全局配置 NAME = 'root' # 用户配置 NAME = 'pe ...
- Spark2.0机器学习系列之11: 聚类(幂迭代聚类, power iteration clustering, PIC)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet all ...
- 修改SQL Service数据库排序规则
修改数据库 alter database KidsPang COLLATE Chinese_PRC_CI_AS 修改表中字段ALTER TABLE [Member] ALTER COL ...
- matplotlib 的 subplot, axes and axis
fig = plt.figure('多图', (10, 10), dpi=80) #第一个指定窗口名称,第二个指定图片大小,创建一个figure对象 plt.subplot(222) #2*2的第二个 ...
- 用python 实现生成双色球小程序
生成双色球小程序: #输入n,随机产生n条双色球号码,插入n条数据库 #表结构: seq CREATE TABLE `seq` ( `id` int(11) NOT NULL AUTO_INCREME ...