ACM掉坑指南

1.求数组内重复元素的最大次数

题目

A - Polycarp’s Pockets

原代码

#include
using namespace std;
class Solution {
     
private:
	int num;
	int min[100] = {
      0 };
	int val[100] = {
      0 };
	int poc[100] = {
      0 };
public:
	 void PPockets();
};
void Solution::PPockets() {
     
	cin >> num;
	for (int i = 1; i <= num; i++) {
     
		cin >> val[i];
	}
	if (num != 1) {
     
		for (int i = 1; i <= num; i++)
			for (int k = 1; k <= num; k++) {
     
				if (val[i] == val[i + k])
					min[i - 1] += 1+1;
			}
		for (int m = num; m > 0; m--) {
     
			if (min[m] > min[m - 1])min[m - 1] = min[m];
		}
		cout << min[0];
	}
	else cout << 1;
};
int main() {
     
	Solution s;
	s.PPockets();
	return 0;
}

问题

  • 对数组的理解运用不够熟练深入,没想到可以这么简便地记录重复元素的次数
for (int i = 0; i < n; i++) {
     	//将重复元素的次数记录在一个数组内
		cin >> x;
		cnt[x]++;
	}
  • 对max函数的了解不多,不懂得运用max函数
int ans = 0;
	for (int i = 1; i <= 100; i++) {
     	//找出最大的重复次数
		ans = max(ans, cnt[i]);
	}
  • 对ACM的风格和追求不够了解
    ACM是以效率为主导的,在代码能正常运行并通过的基础上,首先考虑的是效率,其次才是安全性和其他的东西。

比如:直接用全局函数而不是用类来封闭

int cnt[105];

改代码

#include 
#include
using namespace std;
int cnt[105];
int main() {
     
	ios::sync_with_stdio(0), cin.tie(0);	 //加速cout和cin
	int n, x;
	cin >> n;
	for (int i = 0; i < n; i++) {
     	//将重复元素的次数记录在一个数组内
		cin >> x;
		cnt[x]++;
	}
	int ans = 0;
	for (int i = 1; i <= 100; i++) {
     	//找出最大的重复次数
		ans = max(ans, cnt[i]);
	}
	cout << ans << '\n';// '\n'的效率比endl高,此句去掉'\n'效率也会降低
}

你可能感兴趣的:(笔记,运行出错,acm竞赛,算法,数据结构)