【CSP练习】 线性分类器和稀疏向量

202006-1 线性分类器(100)

#include 
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 
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即可
思路上没什么难的

你可能感兴趣的:(CSP,c++,算法,开发语言)