double变量去重、截距表示、根据坐标求多边形面积(几何题了属于是)
C:直线(填空题)
答案:40257
double判断相等,还是要防止爆精度
double去重,先排序再相邻比较,比较保险
#include <iostream>
#include <algorithm>
#include <math.h>
#include <vector>
#include <set>
#define double long double
#define pdd pair<double,double>
#define EPS 1e-8
using namespace std;
struct cur{
double k,b;
cur(double x,double y):k(x),b(y){}
bool operator<(const cur& n)const{
if(n.k!=k)return k<n.k;
return b<n.b;
}
};
vector<cur> s;
signed main() {
for(int x1=0;x1<20;x1++){
for(int y1=0;y1<21;y1++){
for(int x2=0;x2<20;x2++){
for(int y2=0;y2<21;y2++){
if(x1!=x2&&y1!=y2){
double k=(double)(y2-y1)/(x2-x1);
double b=(double)y1-k*x1;
s.push_back(cur(k,b));
}
}
}
}
}
int m=s.size();
sort(s.begin(),s.end());
int res=1;
for(int i=1;i<m;i++){
if(fabs(s[i].k-s[i-1].k)>EPS||fabs(s[i].b-s[i-1].b)>EPS)res++;
}
cout<<res+21+20;
return 0;
}
巧求截距
上题中,如果直接通过b=y1-k*x1 ,就必须特地为double变量去重,但是如果b=1.0*(x1*y2-x2*y1)/(x1-x2) 这样求截距,可直接通过set<pair<double,double> > ,set自动去重 b=1.0*(x1*y2-x2*y1)/(x1-x2) 其实是根据三角形的面积,回忆一下高中的叉积,常用来求三角形面积
SOBA=SObA-SObB=b*(x1-x2)/2 SOBA就是通过叉积来求=|OA|*|OB|/2=x1*y2-x2*y1 (坐标交叉相乘相减)
根据坐标求多边形面积
两两坐标与原点构成一个小三角形,也是利用叉积分别求每个小三角形面积 图片内容来自这里
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int N=105;
struct node{
int x,y;
};
node a[N];
signed main() {
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].x>>a[i].y;
}
a[n]=a[0];
double sum=0;
for(int i=1;i<=n;i++){
sum+=(a[i].x*a[i-1].y-a[i-1].x*a[i].y);
}
sum/=2;
cout<<sum;
return 0;
}
不过该方法有个缺陷就是输入多边形顶点坐标时必须按顺时针或者逆时针输入,不然的话就会计算错误,得0 从(0,0)开始顺时针输入,则用公式x2y1-x1y2 从(0,0)开始逆时针输入,则用公式x1y2-x2y1 ,比较习惯这个公式
|