CSP 2020解答
2020-06-1
这道题并不是很难,可以直接按照数学的思想解答。对于两个点和一条直线,如果两个点位于直线的同一侧,则若要满足完美分割,两点的种类要相同,否则若是不同侧,则两点的种类不同。
提交时多次出现0分的结果,以为是输入输出的问题,检查了很多次都无法AC。后来仔细看题目的数据要求:点的坐标和直线的参数的绝对值小于10^6,之前想到了相乘的时候会出现溢出,但是我以为不至于一组测试样例都过不了,设置到将int改为long long int之后AC了!确实就是溢出的问题!
其实不需要将点和直线的参数都变为long long int,因为可能内存不足,只需要将直线的三个参数改为long long int就可以。
#include<iostream>
using namespace std;
int n, m; //表示点和查询的直线的个数
//输出共m行,第j行表示对应第j条的查询结果,若可以输出Yes,否则输出No
struct node {
int x;
int y;
char type;
}nodes[1001];
struct line {
long long int a;
long long int b;
long long int c;
}lines[21];
int main(void) {
cin >> n >> m;
int i, j,isok=1;
for (i = 0; i < n; i++) {
cin >> nodes[i].x >> nodes[i].y >> nodes[i].type;
}
for (i = 0; i < m; i++)
cin >> lines[i].a >> lines[i].b >> lines[i].c;
for (i = 0; i < m; i++) {
long long int tmp = lines[i].a + lines[i].b * nodes[0].x + lines[i].c * nodes[0].y;
char tmp_type = nodes[0].type;
isok = 1;
for (j = 1; j < n; j++) {
long long int ttmp = lines[i].a + lines[i].b * nodes[j].x + lines[i].c * nodes[j].y;
char ttmp_type = nodes[j].type;
if (((tmp*ttmp>0)&& (tmp_type == ttmp_type))||((ttmp *tmp<0) && ((tmp_type - ttmp_type)!=0))) //如果和nodes[0]位于同一侧且类型相or不是同一侧而且类型不同
;
else {
isok = 0;
break;
}
}
if(isok)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
2020-06-2
要求:
用(index,value)表示稀疏向量中的值,index从1开始
对两个用稀疏表表示的两个向量u,v,求其内积
思路:
对u,v两个向量的稀疏表示,对index值相同的value进行积求和
这里暴力求解容易出现超时的情况。可以根据两个向量的index是有序的来简化。
测试时出现得分60分,仔细阅读要求发现|value|<10^6,在相乘过程中可能出现溢出的情况。所以需要更改求和sum为long long int。
代码如下:
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int n, a, b; //维数,两个向量所含非零值的个数
struct inode {
int index;
int value;
};
int main(void) {
cin >> n >> a >> b;
struct inode* u = (struct inode*)malloc(sizeof(struct inode) * a);
struct inode* v = (struct inode*)malloc(sizeof(struct inode) * b);
int i,j=0;
for (i = 0; i < a; i++)
cin >> u[i].index >> u[i].value;
for (i = 0; i < b; i++)
cin >> v[i].index >> v[i].value;
//int minnum = min(a, b)
long long int sum = 0;
if (v[b - 1].index < u[0].index || v[0].index>u[a - 1].index) {
cout << sum << endl;
return 0;
}
for (i = 0; i < a; i++) {
for ( ; j < b; j++) {
if (v[j].index < u[i].index)
;
else if (v[j].index == u[i].index)
sum += (u[i].value * v[j].value);
else
break;
}
}
cout << sum << endl;
return 0;
}