求和問題
題目:給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;
}