问题分析
样例:
9 3
1 1 A
1 0 A
1 -1 A
2 2 B
2 3 B
0 1 A
3 1 B
1 3 B
2 0 A
0 2 -3
-3 0 2
-3 1 1
PS:注意直线的点代入计算的顺序,不同的表达是计算的结果是不同的。 思路:将每个点代入直线表达式进行计算,然后利用标志将其分类。
第一回合(错误):
原因是超时。
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{
int x;
int y;
char type[2];
}node[200];
int main(){
int n,m;
int x,y;
int a,b,c;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>node[i].x>>node[i].y>>node[i].type[0];
}
for(int i=0;i<m;i++){
cin>>a>>b>>c;
int succ=1;
int flag_a=-1,flag_b=-1;
for(int j=0;j<n;j++){
int t=(b*node[j].x+c*node[j].y+a>0)?1:0;
if(node[j].type[0]=='A'){
if(flag_a==-1){
flag_a=t;
}else if(flag_a!=t){
succ=0;
break;
}
}
if(node[j].type[0]=='B'){
if(flag_b==-1){
flag_b=t;
}else if(flag_b!=t){
succ=0;
break;
}
}
if(flag_a==flag_b){
succ=0;
break;
}
}
printf("%s\n",succ?"Yes":"No");
}
return 0;
}
第二回合(正确):
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{
int x;
int y;
char type;
}node[1000];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>node[i].x>>node[i].y>>node[i].type;
}
char dayu;
char xiaoyu;
for(int i=0;i<m;i++){
dayu='N';
xiaoyu='N';
int flag=1;
int a,b,c;
cin>>c>>a>>b;
for(int j=0;j<n;j++){
int t=c+a*node[j].x+b*node[j].y;
if(t>0){
if(xiaoyu=='N'){
xiaoyu=node[j].type;
}else if(xiaoyu!=node[j].type){
flag=0;
break;
}
}
else{
if(dayu=='N'){
dayu=node[j].type;
}else if(dayu!=node[j].type){
flag=0;
break;
}
}
}
if(flag==0){
cout<<"No"<<endl;
}else{
cout<<"Yes"<<endl;
}
}
return 0;
}
问题总结
-
两个代码差别不大,为什么第一个就超时了呢?
二者的不同之处有两个地方;
(1)前者使用了三元运算符,后者没有
(2)前者计算的时候判断了点的类别(利用了结构体进行存储),后者没有
-
C++中“单引号”和“双引号”的区别是啥?
’ ’ 引起的字符串按照整数的存储形式,将第一个字符识别为最高位,最后一个字符识别为最低位,按此顺序存入 int 变量 4 个字节的存储空间中;
" " 引起的变量按照第一个字符存储在起始地址处,最后一个字符存储在结束地址处。