7.26 练习题

2024-04-10 18:38
文章标签 练习题 7.26

本文主要是介绍7.26 练习题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

E题

POJ 3348 Cows(凸包求面积)  题目链接http://poj.org/problem?id=3348

相关知识

Andrew算法:

Andrew算法是一种基于水平序的算法,在许多的资料上都会发现说该算法可以看作Graham扫描法的一种变体。

二者都是对所有的点进行扫描得到凸包,不过扫描之前做的处理不同,Andrew算法的大致流程如下:

①将所有的点按照横坐标从小到大进行排序,横坐标相同则按纵坐标从小到大排;

②将P[0]和P[1]加入凸包,然后从P[2]开始判断,判断方式同Graham算法中的判断一致;

然后把点1和点2放入凸包的栈中,然后从p3开始当新的点在凸包前进的方向的左边时加入并继续,否则说明方向已经向内凹了,此时依次删除当时在栈顶的点,直至新点在左边。

此时新点E方向在向量CD的右边,所以需要在凸包的栈中删除C和D,让B的下一个点为E,重复此过程,直至碰到最右边的pn,求出了凸包下部分,然后反过来求出凸包的上部分,合起来求得完整的凸包。

 

这里写图片描述

③将所有的点扫描一遍以后,我们便可以得到一个“下凸包”(因为-横坐标不会减小);

④同理,我们从P[n-2]开始(P[n-1]已经判过了),反着扫描一遍,便可以得到一个“上凸包”;

⑤将两个“半凸包”合在一起就是一个完整的凸包,注意的是由于起点P[0]在正着扫描和反着扫描时都会将其加入凸包,故需要将最后一个点(P[0])去掉才为最终结果。

AC code:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;//精度控制 
const double eps=1e-10;
int dcmp(double x)
{if(fabs(x)<eps) return 0;else return x<0?-1:1;
}//点
struct point
{double x,y;point(){}point(double x,double y):x(x),y(y){}bool operator==(const point& rhs)const{return dcmp(x-rhs.x)==0 && dcmp(y-rhs.y)==0;}bool operator<(const point& rhs)const{return dcmp(x-rhs.x)<0 || (dcmp(x-rhs.x)==0 && dcmp(y-rhs.y)==0);}
};bool cmp(point a,point b)
{if(a.x==b.x) return a.y<b.y;else return a.x<b.x;
}//向量
typedef point Vector;//点-点==向量
Vector operator-(point A,point B) //operator运算 
{return Vector(A.x-B.x,A.y-B.y);//Vector向量 
}//叉积
double Cross(Vector A,Vector B)
{return A.x*B.y-A.y*B.x;
}//多边形面积
double PolygonArea(point *p,int n)
{double area=0;for(int i=1;i<n-1;i++)area+= Cross(p[i]-p[0],p[i+1]-p[0]);return fabs(area)/2;
}//凸包ConvexHull的 Andrew算法 
//计算凸包,输入点数组p,个数为n,输出点数组ch。函数返回凸包顶点数。
//输入不能有重复点,函数执行完成之后输入点的顺序被破坏。
//如果不希望凸包的边上有输入点,把两个 <= 改成 <
int ConvexHull ( point * p,int n, point * ch )
{//sort (p,p+n,cmp ); sort (p,p+n);//按先比x再比y的顺序排序int m=0;for (int i=0;i<n;i ++)//从左到右扫描{while (m >1&& Cross(ch[m -1] - ch[m -2] ,p[i]-ch[m -2]) <=0)   //det:叉积 m --;ch[m ++]= p[i];}int k=m;for (int i=n -2;i >=0;i--)//从右到左扫描{while (m>k&& Cross(ch[m -1] - ch[m -2] ,p[i]-ch[m -2]) <=0)  m --;ch[m ++]= p[i];}if(n >1) m--;return m;//m为凸包顶点个数 
}const int maxn=10000+5;
point p[maxn],ch[maxn];
int main()
{int n;while(scanf("%d",&n)==1){for(int i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);int m=ConvexHull(p,n,ch);double area=PolygonArea(ch,m);printf("%d\n",(int)area/50);}return 0;
}

G题 水

H题 水

I题 折线分割平面

#include<iostream>
using namespace std;
int main()
{int c,n;cin>>c;while(c--){cin>>n;if(n==0)cout<<"1"<<endl;else if(n==1)cout<<"2"<<endl;else if(n==2)cout<<"7"<<endl;elsecout<<(n*n*2-n+1)<<endl;}return 0;
}

 

这篇关于7.26 练习题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891832

相关文章

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

C语言练习题之 数组中出现次数超过一半的数

题目描述 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。 数据范围:n≤50000,数组中元素的值0≤val≤10000 要求:空间复杂度:O(1),时间复杂度O(n) 输入描述: 保证数组输入非空,且保证有

算法练习题17——leetcode54螺旋矩阵

题目描述 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。  代码 import java.util.*;class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 用于存储螺旋顺序遍历的结果List<Integer> result = new ArrayList

Python练习题——站队顺序输出

题目来源:Python语言程序设计(中国大学MOOC) 题目描述: 有一群人站队,每人通过一对整数(h, k)来描述,其中h表示人的高度,k表示在此人前面队列中身高不小于此人的总人数。 实现一个算法输出这个队列的正确顺序。 输入格式: 输入格式为二维列表,即 list[list[]]形式 外层list包含队列中全部的人,内层list为[h,k]格式,代表个人信息。 输出格式: 输

Python练习题——自幂数(水仙花数)

题目来源:Python语言程序设计(中国大学MOOC) 授课老师:嵩天、黄天羽、礼欣 题目描述: “3位水仙花数”是指一个三位整数,其各位数字的3次方和等于该数本身。例如:ABC是一个”3位水仙花数”,则:A的3次方+B的3次方+C的3次方 = ABC。 请按照从小到大的顺序输出所有的3位水仙花数,请用”逗号”分隔输出结果。 代码: output = []for d in range

Mysql基础练习题 1378.使用唯一标识符替换员工ID (力扣)

1378. 展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。 你可以以任意顺序返回结果表。 题目链接: https://leetcode.cn/problems/replace-employee-id-with-the-unique-identifier/ 建表插入数据: Create table If Not Exists E

环形链表练习题笔记

参考大佬题解 141. 环形链表 - 力扣(LeetCode) 环形链表 141. 环形链表 - 力扣(LeetCode) /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val

erlang学习:用OTP构建系统23.12练习题

练习要求 制作一个名为prime_tester_server的gen_server,让它测试给定的数字是否是质数。 你可以使用lib_primes.erl里的is_prime/2函数来处理(或者自己实现一个更好的质数测试函 数)。把它添加到sellaprime_supervisor.erl的监控树里。 质数判断server实现 -module(prime_tester_server).-b

Java语言程序设计基础篇_编程练习题**17.21 (十六进制编辑器)

目录 题目:**17.21 (十六进制编辑器) 代码示例 结果展示 题目:**17.21 (十六进制编辑器)   编写一个 GUI 应用程序,让用户在文本域输入一个文件名,然后按回车键,在文本域显示它的十六进制表达形式。用户也可以修改十六进制代码,然后将它回存到这个文件中,如图17-23b所示。 代码示例 编程练习题17_21HexEditor.java pack

Java语言程序设计基础篇_编程练习题**17.20 (二进制编辑器)

目录 题目:**17.20 (二进制编辑器) 代码示例 结果展示  题目:**17.20 (二进制编辑器)   编写一个GUI应用程序,让用户在文本域输入一个文件名,然后单击回车键,在文本区域显示它的二进制表示形式。用户也可以修改这个二进制代码,然后将它回存到这个文件中,如图17-23a所示。 代码示例 编程练习题17_20BinaryEditor.java pa