CSP-CCF 202006-1 線性分類器 滿分程式碼

icoi_y發表於2020-11-23
作者:its_ycm 
來源:CSDN 
原文:https://blog.csdn.net/its_ycm/article/details/110004491 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

問題描述
試題編號: 202006-1
試題名稱: 線性分類器
時間限制: 1.0s
記憶體限制: 512.0MB
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
樣例輸入

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

用結構體陣列的解法,程式碼如下

#include<bits/stdc++.h>
using namespace std;

struct node{
	int x,y,s;
	char ch;
}nod[1000];

int f[20]; 

int main()
{
	int n,m,a,b,c;
	cin>>n>>m;
	for(int i=0;i<n;++i)
		cin>>nod[i].x>>nod[i].y>>nod[i].ch;
	
	for(int j=0;j<m;++j){
		
		cin>>a>>b>>c;
		
		for(int i=0;i<n;++i){
			
			nod[i].s = (a + b*nod[i].x + c*nod[i].y)>0?-1:1;//!!!!!!!!!!!!!此處1和-1能交換位置
			
			if(i!=0){
				if( (nod[i].ch==nod[0].ch) && ((nod[i].s*nod[0].s)>0) )
					f[j]=1;
				else if( (nod[i].ch!=nod[0].ch) && ((nod[i].s*nod[0].s)<0) )
						f[j]=1;
				else{
					f[j]=-1;
					break;
				}					
			}	
						
		}	
		
	}
	
	for(int i=0;i<m;++i){
		if(f[i]==1)//這裡不能省略==1,因為只有0才是錯誤,1和-1都是正確 能通過。
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}
		
	return 0;
}

大數相乘注意取值範圍!!!!!下面的程式碼把代入直線方程後的結果儲存到s了。所以要用long long型。

#include<bits/stdc++.h>
using namespace std;

struct node{
	int x,y;
	long long s;//!!!!!!!!!!!!!!!
	char ch;
}nod[1000];

int f[20]; 

int main()
{
	int n,m,a,b,c;
	cin>>n>>m;
	for(int i=0;i<n;++i)
		cin>>nod[i].x>>nod[i].y>>nod[i].ch;
	
	for(int j=0;j<m;++j){
		
		cin>>a>>b>>c;
		
		for(int i=0;i<n;++i){
			
			nod[i].s = a + b*nod[i].x + c*nod[i].y;
			
			if(i!=0){
				if( (nod[i].ch==nod[0].ch) && ((nod[i].s*nod[0].s)>0) )
					f[j]=1;
				else if( (nod[i].ch!=nod[0].ch) && ((nod[i].s*nod[0].s)<0) )
						f[j]=1;
				else{
					f[j]=-1;
					break;
				}					
			}	
						
		}	
		
	}
	
	for(int i=0;i<m;++i){
		if(f[i]==1)
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}
		
	return 0;
}

相關文章