202006-1 线性分类器(有点难度)
关键思路
// 等于0直线上,大于0右侧,小于0左侧
// 关键就是类别一个都大于0 ,一个都小于0
代码
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct Point{
int x;
int y;
char type;
};
int main(int argc, char** argv) {
// 点、线的个数
int n,m;
cin>>n>>m;
Point p[n];
//记录A、B 数量
int countA=0,countB=0;
for(int i=0;i<n;i++){
cin>>p[i].x>>p[i].y>>p[i].type;
if(p[i].type=='A'){
countA++;
}
if(p[i].type=='B'){
countB++;
}
}
// 等于0直线上,大于0右侧,小于0左侧
// 关键就是类别一个都大于0 ,一个都小于0
int a0,a1,a2;
// 小于0
int subA=0,subB=0;
// 大于0
int greatherA=0, greatherB=0;
int temp=0;
for(int i=0;i<m;i++){
cin>>a0>>a1>>a2;
greatherA=0;
greatherB=0;
subA=0;
subB=0;
for(int j=0;j<n;j++){
temp=a0+a1*p[j].x+a2*p[j].y;
if(p[j].type=='A') {
if(temp>0) greatherA++;
else subA++;
}else{
if(temp>0) greatherB++;
else subB++;
}
}
//A全部在左侧或者B全部在左侧
if(((greatherA==countA)&&(subB==countB))||((subA==countA)&&(greatherB==countB))){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
return 0;
}
202006-2 稀疏向量(容易60)
给出是非零值下标和值,肯定不能开两个n数组去存值,本来题目的意思就是存零值浪费空间,这样只能60分,所以我们需要只存u非零值和下标,然后根据v的非零值下标去看u是否有相同下标非零值
第二就是注意u和v维度取值最大是10^6,结果是相乘后相加肯定会溢出,需要long long int,还有就是遍历u的时候注意不要越界一定要记得判断
#include<iostream>
#include<stack>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
struct U{
int index;
int value;
};
int main()
{
int n,a,b;
cin>>n>>a>>b;
U u[a];
for(int i=0;i<a;i++){
cin>>u[i].index>>u[i].value;
}
int index,value;
// 注意
long long int sum=0;
// u索引
int uIndex=0;
// 注意u不能越界 uIndex<a
for(int i=0;uIndex<a&&i<b;i++){
cin>>index>>value;
// v的下标超过u非零值下标,不可能同时有非零值跳出
if(index>u[a-1].index) break;
// 在u不越界情况下 看u和v的Index能否相等
while(uIndex<a && u[uIndex].index<index) uIndex++;
// 下标相等证明都有非零值
if(u[uIndex].index==index) sum+=u[uIndex].value*value;
}
cout<<sum;
return 0;
}