前言
第一次写博客,主要想记录一下OJ中遇到的一些问题,给和我一样的小白一些帮助,同时给督促一下自己。最近刚开始练习,遇到了很多问题,也有很多套路和注意事项不太了解。
问题的总结在最后,直接看最后就行!
原题链接
稀疏向量
遇到的问题
在写这道题目的时候我是直接进行了暴力求解,数据结构采用的是矩阵,因为也是第一次做,没有注意到
测试数据说明
用java写的,new出来数组,然后好像就是只拿了50分来着(也有可能是0分啦,忘了忘了
后来在网上找了题解,是说存储量太大了,这样不行,老老实实存(index,value)。然后通过双指针循环着乘积计算和——这里的思想和归并排序中两个数组的合并类似
于是我就去coding,这次好像是拿了70分。一直不知道为啥,就找题解看,也没发现,我就拿提解释了一下,跑过了100分,这就怪了。
又过了一天,在B站上看视频,说是要注意数据类型,很多地方要用long long,不要用int。
于是我把int都给换了,终于成了!!!!
代码
//稀疏向量
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
using namespace std;
using std::vector;
struct Pair
{
long long index;
long long value;
};
int main() {
int n, a, b;
cin >> n;
cin >> a;
cin >> b;
vector<Pair> vec;
vector<Pair> vec1;
int temp = 0, temp1 = 0;
while(a--) {
cin >> temp;
cin >> temp1;
Pair p;
p.index = temp;
p.value = temp1;
vec.push_back(p);
}
while(b--) {
cin >> temp;
cin >> temp1;
Pair p;
p.index = temp;
p.value = temp1;
vec1.push_back(p);
}
long long re = 0;
for (int i = 0, j = 0; i < vec.size() && j < vec1.size();) {
if (vec[i].index < vec1[j].index)
{
i++;
}
else if (vec[i].index > vec1[j].index) {
j++;
}
else{
re += vec[i].value * vec1[j].value;
i++;
j++;
}
}
cout << re;
return 0;
}
回收站选址
遇到的问题
。。。。这边我也是想用矩阵来存储的,但是直接给我来了个存储被我用完了。(hhhhh
主要当时觉得这玩意循环写得超时,但是当我换了个方式,暴力求解的时候就发现还是可以过一些数据的,多少分忘掉了,估计六七十?
然后又找不到原因,去找题解,发现别人也是暴力求解,我就简单看了一下,没发现有啥大的不同,就又拿别人的试了一下。。。。过了。。。。
最后也是和稀疏向量一样,是数据类型的问题,要用long long。
代码
//回收站选址
#include<iostream>
#include<vector>
using namespace std;
using std::vector;
struct Point
{
long long x;
long long y;
};
int main() {
//垃圾点的个数
long long n;
cin >> n;
vector<Point> vec;
while (n--)
{
Point p;
cin >> p.x;
cin >> p.y;
vec.push_back(p);
}
//这边进行处理
int temp1, temp2;
int re[5] = { 0,0,0,0,0 };
for (int i = 0; i < vec.size(); i++) {
temp1 = 0;
temp2 = 0;
for (int j = 0; j < vec.size(); j++) {
if (i == j) {
continue;
}
if (vec[i].x + 1 == vec[j].x && vec[i].y == vec[j].y) {
temp1++;
}
else if (vec[i].x - 1 == vec[j].x && vec[i].y == vec[j].y) {
temp1++;
}
else if (vec[i].x == vec[j].x && vec[i].y + 1 == vec[j].y) {
temp1++;
}
else if (vec[i].x == vec[j].x && vec[i].y - 1 == vec[j].y) {
temp1++;
}
else if (vec[i].x + 1 == vec[j].x && vec[i].y + 1== vec[j].y) {
temp2++;
}
else if (vec[i].x - 1 == vec[j].x && vec[i].y - 1 == vec[j].y) {
temp2++;
}
else if (vec[i].x - 1 == vec[j].x && vec[i].y + 1 == vec[j].y) {
temp2++;
}
else if (vec[i].x + 1 == vec[j].x && vec[i].y - 1 == vec[j].y) {
temp2++;
}
}
if (temp1 == 4) {
re[temp2]++;
}
}
cout << re[0] << endl;
cout << re[1] << endl;
cout << re[2] << endl;
cout << re[3] << endl;
cout << re[4] << endl;
return 0;
}
总结
1.数据类型需要注意——这里都得用long long,int就会出错,分拿不全
2.不要用矩阵存储,数据范围比较大,直接存然后暴力求解也不一定会超时
3.可以学一下C++的STL,我在很多题解中看到了,可以省不少时间(我这就去学
(这两个都是第二题,就搞得我很害怕,很烦躁,还好给解决了~