列表

详情


NC50320. 收集雪花

描述

不同的雪花往往有不同的形状。在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们。一共有n个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状。在收集的过程中,同学们不希望有重复的雪花。你可以从任意a时刻开始,在b时刻停止。a到b时刻中间的雪花也都将被收集。他们希望收集的雪花最多。

输入描述

第一行一个正整数n;
第2行n个非负整数表示n个时刻雪花的形状。

输出描述

最多能收集雪花的数量。

示例1

输入:

5
1 2 3 2 1

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 516ms, 内存消耗: 4456K, 提交时间: 2019-12-08 20:03:15

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

int main() {
  ios::sync_with_stdio(false);
  int n; cin >> n;
  vector<int> A(n); for (auto &a: A) cin >> a;
  int best = 0;
  set<int> S;
  for (int l = 0, r = 0; l < n; l++) {
    while (r < n && !S.count(A[r])) S.insert(A[r++]);
    // for (auto t: S) cout << t << " "; cout << endl;
    best = max(best, r - l);
    S.erase(A[l]);
  }
  cout << best << endl;
}

C++ 解法, 执行用时: 277ms, 内存消耗: 4472K, 提交时间: 2022-02-03 09:40:27

#include<bits/stdc++.h>
using namespace std;
const int mod = 999983;
int f[mod],a[1000001]; 
int main(){
	int n,t = 0,ans = 0,i;
	cin>>n;
	for (i = 1;i <= n;i++)
		cin>>a[i];
	for (i = 1;i <= n;i++){
		t = max(t,f[a[i] % mod]);
		ans = max(ans,i - t);
		f[a[i] % mod] = i;
	}
	cout<<ans;
	return 0;
}

上一题