202006-1 线性分类器(100)
#include <bits/stdc++.h>
using namespace std;
int n,m;
typedef struct{
int x;
int y;
}pointA;
typedef struct{
int x;
int y;
}pointB;
vector<pointA> GA;
vector<pointB> GB;
int main()
{
cin>>n>>m;//点数,查询次数
int a,b,c;
char ch;
for(int i=0;i<n;i++){
cin>>a>>b>>ch;
if(ch=='A'){
pointA p;
p.x=a;
p.y=b;
GA.push_back(p);
}
else{
pointB p;
p.x=a;
p.y=b;
GB.push_back(p);
}
}
int lena=GA.size();
int lenb=GB.size();
int x,y;
for(int i=0;i<m;i++){
cin>>a>>b>>c;
int st;
x=GA[0].x;
y=GA[0].y;
bool flag=true;
if(a+b*x+c*y<0) st=0;//下
else st=1;//上
for(int j=0;j<lena;j++){
x=GA[j].x;
y=GA[j].y;
if(a+b*x+c*y<0&&st==0) continue;
else if(a+b*x+c*y>0&&st==1) continue;
else{
flag=false;
break;
}
}
if(!flag){
cout<<"No"<<endl;
continue;
}
x=GB[0].x;
y=GB[0].y;
if(a+b*x+c*y<0) st=0;//下
else st=1;//上
for(int j=0;j<lenb;j++){
x=GB[j].x;
y=GB[j].y;
if(a+b*x+c*y<0&&st==0) continue;
else if(a+b*x+c*y>0&&st==1) continue;
else{
flag=false;
break;
}
}
if(!flag){
cout<<"No"<<endl;
continue;
}
cout<<"Yes"<<endl;
}
return 0;
}
//测试用例
//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
主要在于对点的保存方式,用两个结构体分别保存A,B类的点,依次遍历每类中的点,只要有一个和前一个点的所在区域不同,直接no。
202006-2 稀疏向量(100)
#include <bits/stdc++.h>
using namespace std;
int n,a,b;
map<long,long> u;
long long sum=0;
int main()
{
cin>>n>>a>>b;
long index,value;
for(int i=0;i<a;i++){
cin>>index>>value;
u[index]=value;
}
for(int i=0;i<b;i++){
cin>>index>>value;
if(u.find(index)!=u.end()){
sum=sum+value*u[index];
}
}
cout<<sum<<endl;
return 0;
}
//10 3 4
//4 5
//7 -3
//10 1
//1 10
//4 20
//5 30
//7 40
第一次:60分,原因是Int类型溢出
第二次:100分,将int改为long,或long long即可
思路上没什么难的