Skip to content

Commit 9b48efc

Browse files
authored
COCI + Dynamic Programming
1 parent 9490bcd commit 9b48efc

27 files changed

+1358
-0
lines changed

DMOJ/coci06c3p2.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Ivan Carvalho
2+
# Solution to https://dmoj.ca/problem/coci06c3p2
3+
4+
def abs_pares(a,b):
5+
return abs(a[0] - b[0]) + abs(a[1] - b[1])
6+
7+
dicio = {
8+
"A" : (0,0), "B" : (0,1), "C" : (0,2), "D" : (0,3),
9+
"E" : (1,0), "F" : (1,1), "G" : (1,2), "H" : (1,3),
10+
"I" : (2,0), "J" : (2,1), "K" : (2,2), "L" : (2,3),
11+
"M" : (3,0), "N" : (3,1), "O" : (3,2), "." : (3,3)
12+
}
13+
14+
ans = 0
15+
16+
for i in range(4):
17+
entrada = input()
18+
for j,c in enumerate(entrada):
19+
if c == ".":
20+
continue
21+
ans += abs_pares((i,j), dicio[c])
22+
23+
print(ans)

DMOJ/coci08c2p4.cpp

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/coci08c2p4
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
typedef long long ll;
7+
8+
const ll INF = 2*1e9;
9+
10+
ll calcula(ll X,vector<ll> A,vector<ll> B){
11+
12+
ll tot = 0;
13+
for(int i = 0;i<A.size();i++){
14+
if(A[i] > X) continue;
15+
tot++;
16+
tot += (X - A[i])/B[i];
17+
}
18+
19+
return tot;
20+
21+
}
22+
23+
ll calcula_tempo(ll coco, vector<ll> A,vector<ll> B){
24+
25+
ll ini = 1,fim = INF,meio,resp = INF;
26+
while(ini <= fim){
27+
meio = (ini+fim)/2;
28+
ll cand = calcula(meio,A,B);
29+
if(cand >= coco){
30+
resp = meio;
31+
fim = meio - 1;
32+
}
33+
else{
34+
ini = meio + 1;
35+
}
36+
}
37+
38+
return resp;
39+
40+
}
41+
42+
ll checa(ll X,ll T,vector<ll> A,vector<ll> B, vector<ll> C,vector <ll> D){
43+
44+
ll coco = calcula(X,A,B);
45+
ll tempo_abrir = calcula_tempo(coco,C,D);
46+
47+
return X + tempo_abrir >= T;
48+
49+
}
50+
51+
int main(){
52+
53+
ll T;
54+
int N,M;
55+
vector<ll> A,B,C,D;
56+
57+
cin >> T;
58+
cin >> N;
59+
for(int i = 0;i<N;i++){
60+
ll x,y;
61+
cin >> x >> y;
62+
A.push_back(x);
63+
B.push_back(y);
64+
}
65+
cin >> M;
66+
for(int i = 0;i<M;i++){
67+
ll x,y;
68+
cin >> x >> y;
69+
C.push_back(x);
70+
D.push_back(y);
71+
}
72+
73+
ll ini = 1,fim = T, resp = T,meio;
74+
while(ini <= fim){
75+
meio = (ini+fim)/2;
76+
if(checa(meio,T,A,B,C,D)){
77+
resp = meio;
78+
fim = meio - 1;
79+
}
80+
else{
81+
ini = meio + 1;
82+
}
83+
}
84+
85+
cout << resp << endl;
86+
87+
return 0;
88+
89+
}

DMOJ/coci14c2p1.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Ivan Carvalho
2+
# Solution to https://dmoj.ca/problem/coci14c2p1
3+
4+
def getgrupo(val,lista):
5+
for i,sublista in enumerate(lista):
6+
if val in sublista:
7+
return i
8+
return -1
9+
10+
grupos = [[],["a","b","c"],
11+
["d","e","f"], ["g","h","i"],
12+
["j","k","l"], ["m","n","o"],
13+
["p","q","r","s"],["t","u","v"],
14+
["w","x","y","z"]
15+
]
16+
17+
resposta = []
18+
permutacao = [int(i) for i in input().split()]
19+
entrada = input()
20+
21+
for i in range(len(entrada)):
22+
23+
if i >= 1 and getgrupo(entrada[i],grupos) == getgrupo(entrada[i-1],grupos):
24+
resposta.append("#")
25+
26+
qual = getgrupo(entrada[i],grupos)
27+
qtd = grupos[qual].index(entrada[i]) + 1
28+
resposta.extend([str(permutacao.index(qual+1)+1)]*qtd)
29+
30+
print("".join(resposta))

DMOJ/coci14c5p4.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Ivan Carvalho
2+
# Solution to https://dmoj.ca/problem/coci14c5p4
3+
4+
N = [int(i) for i in input()]
5+
6+
primeiro = -1
7+
8+
for i in range(len(N)):
9+
if i == 0:
10+
continue
11+
if N[i] % 2 == N[i-1] % 2:
12+
primeiro = i
13+
break
14+
15+
if N[primeiro] == 0:
16+
N[primeiro] = 1
17+
for i in range(primeiro+1,len(N),2):
18+
N[i] = 0
19+
if i + 1 < len(N):
20+
N[i+1] = 1
21+
print("".join([str(i) for i in N]))
22+
elif N[primeiro] == 9:
23+
N[primeiro] = 8
24+
for i in range(primeiro+1,len(N),2):
25+
N[i] = 9
26+
if i + 1 < len(N):
27+
N[i+1] = 8
28+
print("".join([str(i) for i in N]))
29+
else:
30+
31+
copia1 = [i for i in N]
32+
copia2 = [i for i in N]
33+
34+
copia1[primeiro] -= 1
35+
if copia1[primeiro] % 2 == 0:
36+
vainolugar = [9,8]
37+
else:
38+
vainolugar = [8,9]
39+
for i in range(primeiro+1,len(N),2):
40+
copia1[i] = vainolugar[0]
41+
if i + 1 < len(N):
42+
copia1[i+1] = vainolugar[1]
43+
inteiro1 = int("".join([str(i) for i in copia1]))
44+
45+
copia2[primeiro] += 1
46+
if copia1[primeiro] % 2 == 0:
47+
vainolugar = [1,0]
48+
else:
49+
vainolugar = [0,1]
50+
for i in range(primeiro+1,len(N),2):
51+
copia2[i] = vainolugar[0]
52+
if i + 1 < len(N):
53+
copia2[i+1] = vainolugar[1]
54+
55+
inteiro2 = int("".join([str(i) for i in copia2]))
56+
57+
original = int("".join([str(i) for i in N]))
58+
59+
if inteiro2 - original == original - inteiro1:
60+
print("%d %d" % (inteiro1,inteiro2))
61+
elif inteiro2 - original < original - inteiro1:
62+
print(inteiro2)
63+
else:
64+
print(inteiro1)

DMOJ/dp_a.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/dp_a
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
const int MAXN = 1e5 + 10;
7+
const int INF = 2*1e9;
8+
9+
int dp[MAXN],N,K,h[MAXN];
10+
11+
int main(){
12+
13+
scanf("%d",&N);
14+
K = 2;
15+
for(int i = 1;i<=N;i++){
16+
scanf("%d",&h[i]);
17+
}
18+
19+
for(int i = 2;i<=N;i++){
20+
dp[i] = INF;
21+
for(int j = i-1;j>=max(i - K,1);j--){
22+
dp[i] = min(dp[i], dp[j] + abs(h[i] - h[j]) );
23+
}
24+
}
25+
26+
printf("%d\n",dp[N]);
27+
28+
return 0;
29+
30+
}

DMOJ/dp_b.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/dp_b
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
const int MAXN = 1e5 + 10;
7+
const int INF = 2*1e9;
8+
9+
int dp[MAXN],N,K,h[MAXN];
10+
11+
int main(){
12+
13+
scanf("%d %d",&N,&K);
14+
for(int i = 1;i<=N;i++){
15+
scanf("%d",&h[i]);
16+
}
17+
18+
for(int i = 2;i<=N;i++){
19+
dp[i] = INF;
20+
for(int j = i-1;j>=max(i - K,1);j--){
21+
dp[i] = min(dp[i], dp[j] + abs(h[i] - h[j]) );
22+
}
23+
}
24+
25+
printf("%d\n",dp[N]);
26+
27+
return 0;
28+
29+
}

DMOJ/dp_c.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/dp_c
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
const int MAXN = 1e5 + 10;
7+
8+
int vis[MAXN][3],dp[MAXN][3],N,A[3][MAXN];
9+
10+
int solve(int pos,int last){
11+
12+
if(pos == N + 1) return 0;
13+
14+
if(vis[pos][last]) return dp[pos][last];
15+
vis[pos][last] = 1;
16+
17+
int best = 0;
18+
19+
for(int i = 0;i<3;i++){
20+
if(i != last) best = max(best, A[i][pos] + solve(pos+1,i) );
21+
}
22+
23+
return dp[pos][last] = best;
24+
25+
}
26+
27+
int main(){
28+
29+
scanf("%d",&N);
30+
for(int i = 1;i<=N;i++){
31+
scanf("%d %d %d",&A[0][i],&A[1][i],&A[2][i]);
32+
}
33+
34+
printf("%d\n", max(solve(1,0), max(solve(1,1),solve(1,2)) ) );
35+
36+
return 0;
37+
38+
}

DMOJ/dp_d.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/dp_d
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
const int MAXW = 1e5 + 10;
7+
8+
long long knapsack[MAXW];
9+
int N,W;
10+
11+
int main(){
12+
13+
cin >> N >> W;
14+
15+
for(int item = 1;item<=N;item++){
16+
int w,v;
17+
cin >> w >> v;
18+
for(int i = W;i>=w;i--) knapsack[i] = max(knapsack[i-w] + v,knapsack[i]);
19+
}
20+
21+
long long best = 0;
22+
for(int i = 0;i<=W;i++) best = max(best,knapsack[i]);
23+
cout << best << endl;
24+
25+
return 0;
26+
27+
}

DMOJ/dp_e.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Ivan Carvalho
2+
// Solution to https://dmoj.ca/problem/dp_e
3+
#include <bits/stdc++.h>
4+
using namespace std;
5+
6+
typedef long long ll;
7+
8+
const int MAXV = 1e5 + 10;
9+
const int MAXN = 1e3 + 10;
10+
const ll INF = 1e13;
11+
12+
ll dp[MAXV];
13+
int N,W,V,wi[MAXN],vi[MAXN];
14+
15+
int main(){
16+
17+
cin >> N >> W;
18+
for(int i = 1;i<=N;i++){
19+
cin >> wi[i] >> vi[i];
20+
V += vi[i];
21+
}
22+
23+
for(int i = 1;i<=V;i++) dp[i] = INF;
24+
dp[0] = 0;
25+
26+
for(int item = 1;item<=N;item++){
27+
int w = wi[item], v = vi[item];
28+
for(int i = V;i>=v;i--){
29+
dp[i] = min(dp[i],dp[i - v] + w);
30+
}
31+
}
32+
33+
for(int i = V;i>=0;i--){
34+
if(dp[i] <= W){
35+
cout << i << endl;
36+
break;
37+
}
38+
}
39+
40+
return 0;
41+
42+
}

0 commit comments

Comments
 (0)