Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9b48efc

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /