最後更新日期 2024 / 01 / 01

題解 CSES Increasing Array

https://cses.fi/problemset/task/1094/

題意

給你一個陣列
每次修改可以讓任何一個元素的值加一
最少需要修改幾次才能讓整個陣列變成非嚴格遞增的

想法

從陣列左邊往右邊掃過去
遇到凹洞就把它填滿
計算總共需要花多少成本

程式碼

#include<bits/stdc++.h>
#define int long long
using namespace std;
main() {
	ios_base::sync_with_stdio(false);cin.tie(0);
	int n;
	cin >> n;
	int ans = 0;
	vector<int> vec(n);
	for (int i = 0; i < n; i++) {
		cin >> vec[i];
	}
	for (int i = 1; i < n; i++) {
		if (vec[i-1] > vec[i]) {
			ans += vec[i-1] - vec[i];
			vec[i] = vec[i-1];
		}
	}
	cout << ans;
}

推薦文章

題解 CSES Weird Algorithm

給予一個數字 n 如果他是偶數就把他除 2 否則就把他乘 3 再加 1 重複直到 n 變成 1沒什麼特別的概念 直接模擬操作就可以了cppusing namespace std;signed main { int n; cin n; whilen = 1 { cout n " "; if n 1 == 1 { n = 3; n++; } else { n = 2; } } cout 1 endl;}

CSES

題解 CSES Repetitions

你有一個由 A、C、G、T 組成的字串 目標是算出同樣的字母最多連續重複幾次把整個字串從左邊往右掃 用一個 curLen 變數維護目前的長度 遇到一個字母時 curLen 加 1 如果跟上個字母不同就把 curLen 歸零 每次掃過一個字母再用 maxLen 維護出現過最大的 curLencppusing namespace std;signed main { char chr, tmp = 'X'; int maxLen = 1, curLen = 1; while cin chr { if tmp = 'X' tmp == chr { curLen++; } else { curLen = 1; } maxLen = maxmaxLen, curLen; tmp = chr; } cout maxLen endl;}

CSES

題解 CSES Restaurant Customers

給你 n 位客人的進入和離開餐廳的時間 輸出最多同時有幾位客人同時在餐廳- n le 2 times 10^5把每個人加入時間和離開的時間分別看成兩個時間點 並把所有時間點加入陣列後一起排序 然後用一個變數來維護目前餐廳人數 每次遇到加入就增加 反之遇到離開就減少 維護中遇到的最大值就是答案了 時間複雜度:Oncpp using namespace std; signed main { int n; cin n; vectorpii v; for int i = 0; i n; i++ { int s, t; cin s t; v.pushback{s, true}; v.pushback{t, false}; } sortv.begin, v.end; int cur = 0; int ans = 0; for auto e : v { if e.ss == true cur++; else cur--; ans = maxcur, ans; } cout ans endl;}

CSES