1087 有多少不同的值 (20 point(s))

  • 刚开始没有确定题意,感觉应该是对通过算式得到的值标记,然后统计这些标记了的值。所以开了一个 vis 数组,存放这个值是否出现过。第一次出现就 ++ 统计个数。

    但最开始的时候只是把数组大小定义为 2017 稍微试试样例的结果。但发现结果有问题,算出的值小于样例给出的 1480 而只有 1450 。 后面把 i 改成从 2017 开始遍历,然后看到算式给出的结果大于 2017 才发现,原来通过算式计算的下标会远大于 2017 意味着数组越界了。所以要把大小改得更大点才行。

    因为数据的 N 最大是 10000 ,改成 99999 就必然不会越界了,如果大小不够,可能会卡最后一个测试点。

  • 而参考别人的代码,其实可以用 map 这样就不需要理会到底有多大了。

    参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
	int N, num = 0, vis[99999] = {false};
	cin >> N; 
	for(int n = 1; n <= N; n++){
		if(vis[n / 2 + n / 3 + n / 5] == false){
			vis[n / 2 + n / 3 + n / 5] = true;
			num++;
		}
	}
	cout << num;
}
上一篇:用户管理篇三条重要目录文件的查看


下一篇:linux 提权方法总结