(一)题目描述:
题目分析: 能够读懂本题让我们做什么是非常重要的,要求即n个点分成A B两类,所有A类在线的一侧,所有B类点在线的另一侧。转化成当A时,带入直线值全部大于0或者全部小于0;同理,当B时,带入直线值全部大于0或者小于0; (三)c++代码验证:
#include<bits/stdc++.h> using namespace std; struct Dian //设置一个点数结构体 { int x; //点数的横坐标 int y;//点数的纵坐标 char ch;//点数的类别 } ; int main() { int n,m; cin>>n>>m; Dian dian[n]; int i=0; for(i=0;i<n;i++) { cin>>dian[i].x>>dian[i].y>>dian[i].ch; } int Q0,Q1,Q2; //直线的三要素 int j; for(j=0;j<m;j++) { int a0=0,a1=0,b0=0,b1=0; cin>>Q0>>Q1>>Q2; for(i=0;i<n;i++) { if(dian[i].ch=='A') { if(Q0+Q1*dian[i].x+Q2*dian[i].y>0) { a0++; // cout<<"a0:"<<a0<<endl; } else { a1++; // cout<<"a1:"<<a1<<endl; } } else if(dian[i].ch=='B') { if(Q0+Q1*dian[i].x+Q2*dian[i].y>0) { b0++; // cout<<"b0:"<<b0<<endl; } else { b1++; // cout<<"b1:"<<b1<<endl; } } } if(((a0+b1==n)&&a1==0&&b0==0)||((a1+b0==n)&&a0==0&&b1==0)) { // cout<<"a0+b1="<<a0+b1<<"\n"<<"a1+b0="<<a1+b0<<endl; cout<<"Yes"<<endl; } else { //cout<<"a0+b1="<<a0+b1<<"\n"<<"a1+b0="<<a1+b0<<endl; cout<<"No"<<endl; } } return 0; }(四)结果验证 在CCF官网提交,满分。
