2024年7月上海月賽丙組

forleaves發表於2024-08-16

求和問題

題目:給n個數,輸出最長的字首長度,使得字首的和大於等於 0。

分析:字首和,找到最大的位置

程式碼:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n;
long long s[N], f[N];
long long ans;
int main(){
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> s[i];
		s[i] += s[i-1];
	}
	for (int i = n; i >= 0; i--) {
		if (s[i] >= 0) {
			cout << i << endl;
			return 0;
		}
	}
	return 0;
}

得分排名

題目:給出n個學生的分數,從大到小排序後輸出id

分析:結構體排序

程式碼:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n;
int s[N];
pair<int, int> p[N];
int main(){
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> s[i];
		p[i] = {-s[i], i};
	}
	sort(p + 1, p + n + 1);
	for (int i = 1; i <= n; i++) {
		cout << p[i].second << endl;
	}
	return 0;
}

錄製節目(一)

題目:n 個節目,第 i 個節目從時刻 \(s_{i}\) 開始,到 \(t_{i}\) 結束,沒有回放。前一個節目結束時間點和後一個節目開始時間點重合是被允許的。有一臺錄影機,每臺錄影機在工作的時候只能錄一個節目,最多可以錄下多少完整的節目。
分析:經典貪心問題,排序右端點。

程式碼:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, l, r;
int s[N];
pair<int, int> p[N];
bool cmp(pair<int, int> a, pair<int, int> b) {
	return a.second < b.second;
}
int main(){
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> l >> r;
		p[i] = {l, r};
	}
	sort(p + 1, p + n + 1, cmp);
	int cnt = 0, end = 0;
	for (int i = 1; i <= n; i++) {
		if (p[i].first >= end) {
			cnt++;
			end = p[i].second;
		}
	}
	cout << cnt << endl;
	return 0;
}

子集歸零

題目:給出 n 個數統計能從 1 到 n 中,選出多少種不同的下標子集,使得這些下標對應的數字之和等於 0。

分析:n範圍不到22,考慮狀壓。

程式碼:

#include <bits/stdc++.h>
using namespace std;
const int N = 22 + 10;
int n, cnt;
int s[N];
int main(){
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s[i];
	}
	for (int i = 0; i < 1 << n; i++) {
		int ans = 0;
		for (int j = 0; j < n; j++)
			if ((i >> j) & 1) {
				ans += s[j];
			}
		if (!ans) cnt++;
	}
	cout << cnt << endl;
	return 0;
}

池塘計數

題目:\(n*m\)的地圖裡.是水,#是陸地,四聯通的水算一個整體,問有多少不聯通的池塘。

分析:dfs裸題

程式碼:

#include <bits/stdc++.h>
using namespace std;
const int N = 200 + 10;
int n, m, cnt;
string str[N];
int dx[] = {-1, 0, 0, 1};
int dy[] = {0, -1, 1, 0};
void dfs(int x, int y) {
	str[x][y] = '#';
	for (int i = 0; i < 4; i++) {
		int xx = x + dx[i];
		int yy = y + dy[i];
		if (xx >= 0 && xx < n 
			&& yy >= 0 && yy < m 
				&& str[xx][yy] == '.')
					dfs(xx, yy);
	}
}
int main(){
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> str[i];
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (str[i][j] == '.') {
				dfs(i, j);
				cnt++;
			}
		}
	}
	cout << cnt << endl;
	return 0;
}

相關文章