[2019藍橋杯國賽B組c++][最優包含][排列數][第八大奇蹟]
個人題解連結,藍橋杯歷屆試題,正在更新中~
最優包含
題目連結:點選
思路:顯然的dp.
設
狀
態
為
d
p
[
i
]
[
j
]
代
表
前
i
個
包
含
前
j
個
要
改
變
的
次
數
設狀態為dp[i][j] 代表前i個包含前j個要改變的次數
設狀態為dp[i][j]代表前i個包含前j個要改變的次數
轉移方程:
i
f
s
[
i
]
=
=
t
[
j
]
:
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
−
1
]
if s[i]==t[j] :dp[i][j]=dp[i-1][j-1]
ifs[i]==t[j]:dp[i][j]=dp[i−1][j−1]
e
l
s
e
:
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
−
1
]
[
j
]
,
d
p
[
i
−
1
]
[
j
−
1
]
+
1
)
else:dp[i][j]=min(dp[i-1][j],dp[i-1][j-1]+1)
else:dp[i][j]=min(dp[i−1][j],dp[i−1][j−1]+1)
注意初始化為正無窮,
d
p
[
i
]
[
0
]
dp[i][0]
dp[i][0]初始化為0
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double Pi = acos(-1);
namespace {
template <typename T> inline void read(T &x) {
x = 0; T f = 1;char s = getchar();
for(; !isdigit(s); s = getchar()) if(s == '-') f = -1;
for(; isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48);
x *= f;
}
}
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (register int i = (n); i < (m); ++i)
#define _rep(n,m,i) for (register int i = (n); i <= (m); ++i)
#define _srep(n,m,i)for (register int i = (n); i >= (m); i--)
#define _sfor(n,m,i)for (register int i = (n); i > (m); i--)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) x & (-x)
#define pii pair<int,int>
#define fi first
#define se second
const int N = 1e3+5;
char s[N], t[N];
int dp[N][N];// 前i個和包括了前j個要改幾次
int main() {
scanf("%s %s", s + 1, t + 1);
int n = strlen(s+1), m = strlen(t+1);
memset(dp, 0x3f, sizeof dp);
dp[0][0] = 0;
for(int i = 1; i <= n; ++i) {
dp[i][0] = 0;
for(int j = 1; j <= m && j <= i; ++j) {
if(s[i] == t[j]) {
dp[i][j] = dp[i-1][j-1];
} else {
dp[i][j] = min(dp[i-1][j], dp[i-1][j-1] + 1);
}
}
}
cout << dp[n][m] << endl;
}
排列數
題目連結:排列數
思路:顯然dp
設
狀
態
為
d
p
[
i
]
[
j
]
代
表
前
i
個
數
,
有
j
個
折
點
設狀態為dp[i][j]代表前i個數,有j個折點
設狀態為dp[i][j]代表前i個數,有j個折點
我們可以發現折點的數量就是波峰+波谷的數量。
雖然推出來後轉移方程很簡單,但是並不是特別的好推,我們得先把各種情況先看一遍,最後總結起來你就會發現轉移很簡單。
對於不同的折點數量,我們分為奇數偶數考慮,再對於每種情況我們分最後一個是波峰還是波谷考慮。
然後對於i個數,要變成i+1個數,肯定是插入了i+1,然後它有i+1個位置可以選擇。我們發現波峰周圍的2個位置是特殊的,在這裡插入,折點的數量不變。如果最後一個是波谷,那麼在最後插入會不變,如果第一個也是波谷,那麼在第一個位置插入也會不變(分成奇偶,和最後一個是波峰波谷就可以判斷出這兩種情況)。最後總結起來就是
d
p
[
i
+
1
]
[
j
]
+
=
d
p
[
i
]
[
j
]
∗
2
dp[i+1][j]+=dp[i][j]*2
dp[i+1][j]+=dp[i][j]∗2
d
p
[
i
+
1
]
[
j
+
1
]
=
d
p
[
i
]
[
j
]
∗
(
j
+
1
)
dp[i+1][j+1]=dp[i][j]*(j+1)
dp[i+1][j+1]=dp[i][j]∗(j+1)
d
p
[
i
+
1
]
[
j
+
2
]
=
d
p
[
i
]
[
j
]
∗
(
i
+
1
−
j
−
1
−
2
)
dp[i+1][j+2]=dp[i][j]*(i+1-j-1-2)
dp[i+1][j+2]=dp[i][j]∗(i+1−j−1−2)
答案就是
d
p
[
n
]
[
k
−
1
]
dp[n][k-1]
dp[n][k−1]
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double Pi = acos(-1);
namespace {
template <typename T> inline void read(T &x) {
x = 0; T f = 1;char s = getchar();
for(; !isdigit(s); s = getchar()) if(s == '-') f = -1;
for(; isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48);
x *= f;
}
}
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (register int i = (n); i < (m); ++i)
#define _rep(n,m,i) for (register int i = (n); i <= (m); ++i)
#define _srep(n,m,i)for (register int i = (n); i >= (m); i--)
#define _sfor(n,m,i)for (register int i = (n); i > (m); i--)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) x & (-x)
#define pii pair<int,int>
#define fi first
#define se second
const int Mod = 123456;
const int N = 5e2+5;
int dp[N][N] ;
int main() {
int n, k; read(n); read(k);
dp[1][0] = 1;
for(int i = 2; i <= n; ++i) {
dp[i][0] = 2;
for(int j = 0; j <= i - 2; ++j) {
dp[i][j] %= Mod;
dp[i+1][j] += dp[i][j] * (j+1);
dp[i+1][j+1] += dp[i][j] * 2;
dp[i+1][j+2] += dp[i][j] * (i-j-2);
}
}
cout << dp[n][k-1] % Mod << endl;
}
第八大奇蹟
題目連結:點選
思路:這題其實就是一道裸題,整體二分or樹套樹,當然用整體二分好寫點。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double Pi = acos(-1);
namespace {
template <typename T> inline void read(T &x) {
x = 0; T f = 1;char s = getchar();
for(; !isdigit(s); s = getchar()) if(s == '-') f = -1;
for(; isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48);
x *= f;
}
}
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (register int i = (n); i < (m); ++i)
#define _rep(n,m,i) for (register int i = (n); i <= (m); ++i)
#define _srep(n,m,i)for (register int i = (n); i >= (m); i--)
#define _sfor(n,m,i)for (register int i = (n); i > (m); i--)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) x & (-x)
#define pii pair<int,int>
#define fi first
#define se second
const int N = 1e5+5;
int a[N];
struct node {
int op, x, y, k, id;
}e[N*10], lq[N], rq[N];
int cnt, ans[N];
int T[N];
int n, L;
void upd(int pos, int val) {
for(; pos <= L; pos += lowbit(pos)) T[pos] += val;
}
int qry(int pos) {
int res = 0;
for(; pos; pos -= lowbit(pos)) res += T[pos];
return res;
}
void solve(int vl, int vr, int ql, int qr) {
if(ql > qr || vl > vr) return ;
if(vl == vr) {
for(int i = ql; i <= qr; ++i) {
if(e[i].op == 2) ans[e[i].id] = vl;
}
return ;
}
int mid = vl + vr >> 1, l = 0, r = 0;
for(int i = ql; i <= qr; ++i) {
if(e[i].op == 1) {
if(e[i].y > mid) {
upd(e[i].x, e[i].k);
rq[++r] = e[i];
} else {
lq[++l] = e[i];
}
} else {
int k = qry(e[i].y) - qry(e[i].x-1);
if(k < e[i].k) {
e[i].k -= k;
lq[++l] = e[i];
} else {
rq[++r] = e[i];
}
}
}
for(int i = ql; i <= qr; ++i) {
if(e[i].op == 1 && e[i].y > mid) {
upd(e[i].x, -e[i].k);
}
}
for(int i = 1; i <= l; ++i) e[i+ql-1] = lq[i];
for(int i = 1; i <= r; ++i) e[i+ql+l-1] = rq[i];
solve(vl, mid, ql, ql+l-1);
solve(mid+1, vr, ql+l, qr);
}
int main() {
read(L); read(n);
char op[3];
memset(ans, -1, sizeof ans);
for(int i = 1, x, y; i <= n; i++) {
scanf("%s %d %d", op, &x, &y);
if(op[0] == 'C') {
if(a[x]) {
e[++cnt] = node {1, x, a[x], -1};
e[++cnt] = node {1, x, y, 1};
a[x] = y;
} else {
e[++cnt] = node {1, x, y, 1};
a[x] = y;
}
} else {
e[++cnt] = node {2, x, y, 8, i};
}
}
solve(0, 1e9, 1, cnt);
for(int i = 1; i <= n; ++i) {
if(~ans[i]) {
printf("%d\n", ans[i]);
}
}
}
相關文章
- 第14屆藍橋杯B組國賽
- 第十三屆藍橋杯省賽C/C++ B組C++
- 2017省賽藍橋杯B組
- 第十屆藍橋杯C++國賽B組部分題解(假題解)C++
- 2017第八屆藍橋杯C/C++ B組省賽第二題 秒解C++
- 【藍橋杯考前突擊】第十屆藍橋杯省賽C/C++大學B組 試題 D 數的分解C++
- 2018藍橋杯省賽B組
- 藍橋杯__省賽__第八屆__C/C++__大學A組C++
- 藍橋杯javaB組備賽Java
- 第六屆藍橋杯省賽CC++B組C++
- 第十屆藍橋杯省賽C++B組 等差數列C++
- 試題B:小球反彈(第十五屆藍橋杯省賽B組c/c++組)C++
- 第十五屆藍橋杯大賽軟體賽省賽 C/C++ 大學 A 組C++
- 2019年省賽第十屆藍橋杯B組C/C++試題H解 等差數列C++
- 2020藍橋杯省賽B組C++(第二場)真題C++
- 第十四屆藍橋杯省賽C++ B組(個人經歷 + 題解)C++
- 2022年藍橋杯C++B組國賽-試題D-最大數字C++
- 2024年第十五屆藍橋杯軟體類國賽 C/C++ B組 個人解法C++
- 第四屆藍橋杯C/C++本科B組第二道大題C++
- 【題目解析】藍橋杯23國賽C++中高階組 - 鬥魚養殖場C++
- 藍橋杯大賽——驅動程式
- 第十五屆藍橋杯C++B組省賽總結C++
- 第十三屆藍橋杯省賽A組
- 2012年第三屆藍橋杯C/C++程式設計本科B組省賽 大數乘法(程式碼填空)C++程式設計
- 【藍橋杯考前突擊】第十一屆藍橋杯校賽模擬C/C++ 正整數序列C++
- 第十五屆藍橋杯軟體賽省賽C/C++B 組題解C++
- 2016 藍橋杯省賽C語言B組 第六題 方格填數C語言
- 第九屆藍橋杯大賽個人賽決賽(軟體類本科B組)做題筆記 mit zwei Antworten筆記MIT
- 2015年藍橋杯六屆省賽大學B組真題
- 2016年藍橋杯C/C++組省賽第一題--煤球數目C++
- 第九屆藍橋杯軟體類省賽 Java B組 題目及解析Java
- 2015年省賽第六屆藍橋杯B組C/C++第五題解 九陣列分數C++陣列
- 第九屆藍橋杯省賽C++A組 倍數問題(dfs)C++
- 2015藍橋杯省賽javaA組-----牌型種數(填空)Java
- 第十四屆藍橋杯大賽軟體賽省賽Python 《三國遊戲》Python遊戲
- 藍橋杯大賽微控制器組國信長天開發板個人總結 | 建立工程
- 2013藍橋杯題解c組C++C++
- 2016年省賽第七屆藍橋杯B組C/C++第九題解 交換瓶子C++