题目链接
题目知识点:
运算符重载
STL(vector)
Sort函数
类
这题也比较简单,首先读题,需要看清楚输入数字的范围。因为在78910这4个检测点中
n
≤
1
0
9
n\leq10^9
n≤109且
a
,
b
≤
5
∗
1
0
5
a,b\leq 5*10^5
a,b≤5∗105,因此输入数据的时候要注意,计算的时候结果最好用最大的long long int
,这样就能尽量保持不溢出。当然如果再大用到大数加减法的话难度就会激增了。
另外在写代码的时候,开头比如说
#include<vector>
#include<iostream>
#include<algoritm>
using namspace std;
这种经典的起手式千万别忘了,还有一些比较关键的语法点比如说sort
要求重载的是<
运算符,其类中代码的格式为bool operator<(const classname& a){};
一定要关注到。CCFCSP考试我就经常编译失败……人都麻了,C++基础大家还是要好好关注的,至少自己得能De出自己都Bug来。
算法角度来说,这题也比较简单,其他的也没啥好说,解题思路就是先构建point
类,每一个输入点都是一个point
,一个向量就用vector<point>
来进行建模,全部输入之后先对所有的点按照维度进行排序,复杂度O(nlogn)
,最后自小到大逐个进行比较,然后用一个sum
来统计和,就OK了。
对于CCF/CSP的第二题,一般都是需要先构建类然后进行排序的,不然暴力求解的复杂度通常有
O
(
n
2
)
O(n^2)
O(n2),只能拿到50分。通过排序算法复杂度会降低到
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)再加数次规模为
O
(
n
)
O(n)
O(n)遍历就可以求解问题,其中要巧妙的使用Hashtable
以及动态规划等方法,这些基础都要打扎实。
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;//别老忘了这个
class point {
public:
bool operator<(const point& a) {
return (this->position < a.position);
};
point(long long int a, long long int b) { this->position = a; this->num = b; };
point() { this->position = 0; this->num = 0; };
long long int position;
long long int num;
};
int main(void) {
int dims, valuea, valueb, i;
cin >> dims >> valuea >> valueb;
vector<point>veca(valuea);
vector<point>vecb(valueb);
long long int temp1, temp2;
for (i = 0; i < valuea; i++) {
cin >> temp1 >> temp2;
veca[i] = point(temp1, temp2);
}
for (i = 0; i < valueb; i++) {
cin >> temp1 >> temp2;
vecb[i] = point(temp1, temp2);
}
sort(veca.begin(), veca.end());
sort(vecb.begin(), vecb.end());
long long int sum = 0;
point tp1; int ita = 0;
point tp2; int itb = 0;
while (ita < valuea && itb < valueb) {
tp1 = veca[ita]; tp2 = vecb[itb];
if (tp1.position == tp2.position) { sum += tp1.num * tp2.num; ita++; itb++; }
if (tp1.position > tp2.position) { itb++; }
if (tp1.position < tp2.position) { ita++; }
}
cout << sum;
return 0;
}