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 c487c99

Browse files
IOI problems
1 parent d76f632 commit c487c99

File tree

4 files changed

+245
-0
lines changed

4 files changed

+245
-0
lines changed

‎DMOJ/ioi10p1.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "cluedo.h"
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
void Solve(){
6+
7+
int marcado1[11],marcado2[11],marcado3[11];
8+
memset(marcado1,0,sizeof(marcado1));
9+
memset(marcado2,0,sizeof(marcado2));
10+
memset(marcado3,0,sizeof(marcado3));
11+
12+
for(int i = 1;i<=6;i++){
13+
for(int j = 1;j<=10;j++){
14+
for(int k = 1;k <= 6;k++){
15+
if(!marcado1[i] && !marcado2[j] && !marcado3[k]){
16+
int x = Theory(i,j,k);
17+
if(x == 1) marcado1[i] = 1;
18+
else if(x == 2) marcado2[j] = 1;
19+
else if(x == 3) marcado3[k] = 1;
20+
else break;
21+
}
22+
}
23+
}
24+
}
25+
26+
}

‎DMOJ/ioi10p5.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "memory.h"
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
void play(){
6+
7+
int minimo[300],maximo[300];
8+
for(int i = 0;i<300;i++){
9+
minimo[i] = 300;
10+
maximo[i] = 0;
11+
}
12+
13+
for(int i = 1;i<=50;i++){
14+
int x = faceup(i);
15+
minimo[x] = min(minimo[x],i);
16+
maximo[x] = max(maximo[x],i);
17+
}
18+
19+
for(char c = 'A';c<='Y';c++){
20+
//printf("FUP %d %d\n",minimo[c],maximo[c]);
21+
faceup(minimo[c]);
22+
faceup(maximo[c]);
23+
}
24+
25+
}

‎DMOJ/ioi13p2.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include <bits/stdc++.h>
2+
#include "artclass.h"
3+
using namespace std;
4+
5+
const int MAXN = 510;
6+
const int dx[4] = {1,-1,0,0};
7+
const int dy[4] = {0,0,1,-1};
8+
const double averages[4] = {1396298.1629,2777443.2301,6868228.6964,346063.6347};
9+
10+
int matriz[MAXN][MAXN],H,W;
11+
long long somatorio;
12+
double media;
13+
14+
int junta(int r,int g,int b){
15+
return (r << 16) | (g << 8) | (b);
16+
}
17+
18+
inline int valido(int a,int b){
19+
return min(a,b) >= 0 && a < H && b < W;
20+
}
21+
22+
int calcula(int x,int y){
23+
int total = 0;
24+
for(int i = 0;i<4;i++){
25+
int nx = x + dx[i];
26+
int ny = y + dy[i];
27+
if(!valido(nx,ny)) continue;
28+
total += abs(matriz[x][y] - matriz[nx][ny]);
29+
}
30+
return total;
31+
}
32+
33+
void roda(){
34+
for(int i = 0;i<H;i++){
35+
for(int j = 0;j<W;j++){
36+
somatorio += calcula(i,j);
37+
}
38+
}
39+
}
40+
41+
int style(int h, int w, int R[500][500], int G[500][500], int B[500][500]){
42+
43+
somatorio = 0;
44+
media = 0;
45+
H = h;W = w;
46+
47+
for(int i = 0;i<H;i++){
48+
for(int j = 0;j<W;j++){
49+
matriz[i][j] = junta(R[i][j],G[i][j],B[i][j]);
50+
}
51+
}
52+
roda();
53+
54+
media = somatorio/double(H*W);
55+
56+
double melhor_dist = fabs(media - averages[0]);
57+
int resp = 0;
58+
for(int i = 1;i<4;i++){
59+
if(fabs(media - averages[i]) <= melhor_dist){
60+
melhor_dist = fabs(media - averages[i]);
61+
resp = i;
62+
}
63+
}
64+
65+
return resp+1;
66+
67+
}
68+

‎DMOJ/ioi16p4.cpp

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
4+
const int MAXN = 2*1e5 + 10;
5+
const int MAXK = 101;
6+
7+
int V[MAXN],Black[MAXN],White[MAXN];
8+
int dp[MAXN][MAXK][2],block_sz[MAXN],pref_sum[MAXN],N,K;
9+
10+
int valid(int a,int b){
11+
if(max(a,b) > N) return 0;
12+
return (b - a + 1) == (pref_sum[b] - pref_sum[a-1]);
13+
}
14+
15+
void add(int a,int b){
16+
Black[a]++;
17+
Black[b+1]--;
18+
}
19+
20+
int solve(int pos,int k,int naopode){
21+
22+
if(k == -1) return 0;
23+
24+
int &ret = dp[pos][k][naopode];
25+
26+
if(dp[pos][k][naopode] != -1) return ret;
27+
28+
ret = 0;
29+
30+
if(pos == N + 1){
31+
if(k == 0){
32+
ret = 1;
33+
}
34+
else{
35+
ret = 0;
36+
}
37+
return ret;
38+
}
39+
40+
if(naopode){
41+
if(V[pos] == 0 || V[pos] == 1){
42+
if(solve(pos+1,k,0)){
43+
White[pos]++;
44+
ret = 1;
45+
}
46+
return ret;
47+
}
48+
else if(V[pos] == 2){
49+
ret = 0;
50+
return ret;
51+
}
52+
}
53+
54+
if(V[pos] == 0 || V[pos] == 1){
55+
if(solve(pos+1,k,0)){
56+
White[pos]++;
57+
ret = 1;
58+
}
59+
}
60+
if(V[pos] == 0 || V[pos] == 2){
61+
if(valid(pos, pos + block_sz[k] - 1 ) && solve(pos + block_sz[k],k - 1,1)){
62+
add(pos, pos + block_sz[k] - 1 );
63+
ret = 1;
64+
}
65+
}
66+
67+
return ret;
68+
69+
}
70+
71+
string solve_puzzle(string s, int k, int c[]){
72+
73+
N = s.size();
74+
K = k;
75+
76+
memset(dp,-1,sizeof(dp));
77+
for(int i = K,j = 0;j<k;i--,j++){
78+
block_sz[i] = c[j];
79+
}
80+
81+
for(int i = 1;i<=N;i++){
82+
if(s[i-1] == '.'){
83+
pref_sum[i] = pref_sum[i-1] + 1;
84+
V[i] = 0;
85+
}
86+
else if(s[i-1] == 'X'){
87+
pref_sum[i] = pref_sum[i-1] + 1;
88+
V[i] = 2;
89+
}
90+
else{
91+
pref_sum[i] = pref_sum[i-1];
92+
V[i] = 1;
93+
}
94+
}
95+
96+
solve(1,K,0);
97+
98+
string ans;
99+
for(int i = 1;i<=N;i++){
100+
Black[i] += Black[i-1];
101+
if(Black[i] > 0 && White[i] > 0){
102+
ans.push_back('?');
103+
}
104+
else if(White[i] > 0){
105+
ans.push_back('_');
106+
}
107+
else{
108+
ans.push_back('X');
109+
}
110+
}
111+
112+
return ans;
113+
114+
}
115+
116+
int main(){
117+
118+
string si;
119+
int ki,ci[MAXN];
120+
cin >> si;
121+
cin >> ki;
122+
for(int i = 0;i<ki;i++) cin >> ci[i];
123+
cout << solve_puzzle(si,ki,ci) << endl;
124+
125+
return 0;
126+
}

0 commit comments

Comments
(0)

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