CCF认证(1)——稀疏向量与回收站选址问题

CCF认证(1)——稀疏向量与回收站选址问题

前言

第一次写博客,主要想记录一下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,我在很多题解中看到了,可以省不少时间(我这就去学

(这两个都是第二题,就搞得我很害怕,很烦躁,还好给解决了~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值