zoukankan      html  css  js  c++  java
  • 「POJ

    BUPT 2017 summer training (16) #2 A

    题意

    有一个玩具盒,被n个隔板分开成左到u右n+1个区域,然后给每个玩具的坐标,求每个区域有几个玩具。

    题解

    依次用叉积判断玩具在每个隔板左边还是右边。

    知识

    (vec a=(x_1,y_1),vec b=(x_2,y_2))

    点乘:内积(数量积),(vec{a}cdotvec{b}=|a||b|cos heta=x_1cdot x_2+y_1cdot y_2)

    叉乘:外积(向量积),(|vec{c}|=|vec{a} imesvec{b}|=|a||b|sin heta=x_1cdot y_2-x_2cdot y_1)

    向量积的结果是一个向量,方向用“右手法则”判断(四指为a的方向,朝手心方向摆动到b的方向,大拇指就是c的方向)

    几何意义:

    点乘的几何意义是:是一条边向另一条边的投影乘以另一条边的长度

    叉乘的几何意义是:两个矢量围成的平行四边形的面积

    代码

    #include <cstdio>
    #define N 50001
    int n,m;
    int x1,y1,x2,y2,u[N],l[N];
    int ans[N];
    int xmul(int x1,int y1,int x2,int y2){
    	return (x1*y2)-(x2*y1);
    }
    int main(){
    	while(scanf("%d",&n),n){
    		scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
    		for(int i=0;i<n;++i)
    			scanf("%d%d",u+i,l+i),ans[i]=0;
    		ans[n]=0;
    		for(int i=0,j,x,y;i<m;++i){
    			scanf("%d%d",&x,&y);
    			for(j=0;j<n;++j)
    				if(xmul(x-l[j],y-y2,u[j]-l[j],y1-y2)<=0)
    					break;
    			++ans[j];
    		}
    		for(int i=0;i<=n;++i)
    			printf("%d: %d
    ",i,ans[i]);
    		puts("");
    	}
    }
    
  • 相关阅读:
    210
    209
    208
    207
    定时任务crontab
    Python的zip与*zip函数的应用
    Python的reduce函数与map函数
    解析:cpu与io密集在何场景适合使用多进程,多线程,协程
    Python上下文(转载)
    C10K与C10M的问题
  • 原文地址:https://www.cnblogs.com/flipped/p/7207560.html
Copyright © 2011-2022 走看看