Education CodeForces Round 25 문제 해결
Education CodeForces Round 25 문제 해결
Contest 825 Dashboard
A. Binary Protocol
제목의 뜻
01열을 주십시오. 이 열은 10진수 encode에서 얻을 수 있습니다. 방법은 모든 숫자가 같은 수량의 1이 되고 숫자 사이를 0으로 구분하는 것입니다.
사고의 방향
물?
코드
#include
using namespace std;
int main(){
int n, cur = 0, cnt = 0;
char s[100], ans[100];
scanf("%d%s", &n, s);
for (int i = 0; i < n; ++i)
s[i]-'0'? ++cnt : (ans[cur++] = cnt + '0', cnt = 0);
ans[cur++] = cnt + '0';
ans[cur] = '\0';
puts(ans);
return 0;
}
B. Five-In-a-Row
제목의 뜻
오자 바둑판을 제시하여 그 중에서'X'가 필승태인지 아닌지를 판단하다.
사고의 방향
모방하다.
코드
#include
using namespace std;
char maps[15][15];
int dir[8][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};
bool flag = 0;
void judge(int x, int y) {
maps[x][y] = 'X';
for (int i = 0, cnt = 0; i < 10; ++i) {
maps[x][i] == 'X'? ++cnt : cnt = 0;
if (cnt == 5) flag = 1;
}
for (int i = 0, cnt = 0; i < 10; ++i) {
maps[i][y] == 'X'? ++cnt : cnt = 0;
if (cnt == 5) flag = 1;
}
for (int i = 0, j = 0, cnt = 0; i < 10 && j < 10; ++i, ++j){
int u = i, v = y - x + j;
if (y < 0 || y > 9) continue;
maps[u][v] == 'X'? ++cnt : cnt = 0;
if (cnt == 5) flag = 1;
}
for (int i = 0, j = 0, cnt = 0; i < 10 && j < 10; ++i, ++j) {
int u = i, v = y + x - j;
if (y > 9 || y < 0) continue;
maps[u][v] == 'X'? ++cnt : cnt = 0;
if (cnt == 5) flag = 1;
}
maps[x][y] = '.';
}
void check(int x, int y) {
for (int i = 0; i < 8; ++i) {
int u = x + dir[i][0], v = y + dir[i][1];
if (u < 0 || v < 0 || u > 9 || v > 9) continue;
if (maps[u][v] == '.') judge(u, v);
if (flag) return;
}
}
int main(){
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif
for (int i = 0; i < 10; ++i) scanf("%s", maps[i]);
for (int i = 0; i < 10; ++i)
for (int j = 0; j < 10; ++j) {
if (maps[i][j] == 'X') check(i, j);
if (flag) goto a; //
}
a:
puts(flag ? "YES" : "NO");
return 0;
}
C. Multi-judge Solving
제목의 뜻
메이크스가 난이도
i
의 문제를 풀었다면 i*2
의 문제를 풀 수 있었다.처음에 메이커스가 풀었던 최고 난이도 문제k
는 리스트에 있는 모든 문제를 다 풀고 중간에 몇 문제를 발판으로 삼아야 하는지 물었다.사고의 방향
욕심
k
를 수조에 넣고 순서를 정하고upper_bound
비교k
다음 한 문제를 얻어 그것을 만들 수 있는지 판단하고, 할 수 있다면 계속upper_bound
하고, 그렇지 않으면 몇 문제가 필요한지 판단해서 발판으로 삼는다.코드
#include
using namespace std;
int main(){
int n, k, num[1007], ans = 0;
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i)
scanf("%d", num+i);
num[0] = k;
sort(num, num+n+1);
for (int now = k, nxt = upper_bound(num, num+n+1, now<<1) - num, cur = 1; nxt <= n; nxt = upper_bound(num, num+n+1, now<<1) - num) {
now = num[nxt-1], cur = nxt-1;
nxt = upper_bound(num, num+n+1, now<<1) - num;
while (nxt == cur+1 && nxt != n+1) {
++ans, now <<= 1;
nxt = upper_bound(num, num+n+1, now<<1) - num;
}
}
printf("%d
", ans);
return 0;
}
D. Suitable Replacement
제목의 뜻
주열
s
과 모드열t
을 제시하는데 주열 중 약간'?'
이 있으니 이것'?'
을 보충해야 한다.다음 문자열을 채우려면 임의의 순서에서 가장 많은 패턴 문자열을 찾을 수 있어야 합니다. t
사고의 방향
아날로그+욕심을 생각했는데 생각해보면 코드량이 많을 거예요.
Dalao의 코드를 보고 생각을 바꾸었다. 먼저 메인 열에
'?'
를 제외한 문자의 수량을 통계했다.그리고 주열을 훑어보고 '?'
가 나타날 때마다 현재'?'
의 수량에 대응하는 t
열의 위치를 찾습니다. 만약 이 위치가 문자가 주열에 포함된 것이라면 주열이라는 문자의 수량을 다시 이 '?'
열을 훑어보고 주열에 없는 문자를 훑어볼 때까지 t
열로 이 문자를 채웁니다.코드
#include
using namespace std;
const int maxn = 1e6+7;
int main(){
int hash[26] = {}, cur = 0, len_t;
char s[maxn], t[maxn];
scanf("%s%s", s, t);
len_t = strlen(t);
for (int i = 0; s[i]; ++i) ++hash[s[i]-'a'];
for (int i = 0; s[i]; ++i) if (s[i] == '?') {
++cur, cur %= len_t;
hash[t[cur]-'a'] > 0 ? (--hash[t[cur]-'a'], --i) : s[i] = t[cur];
}
puts(s);
return 0;
}
E. Minimal Labels
제목의 뜻
유방향 무환도를 제시하고 이 그림의 토폴로지 순서에 따라 이 그림의 각 노드에 표시를 하며, 표시의 배열을 요구하는 것은 사전 순서가 가장 작을 수 있는 것이다.
사고의 방향
처음에는 토폴로지 서열을 정상적으로 뛰고 우선순위로 가장 작은 표호를 주겠다고 생각했지만 해정거hack은 이런 방법을 썼다.주요 문제는 문제의 뜻을 제대로 읽지 못한 데 있다.나는 기호가 맞은 점의 번호 배열 사전의 순서가 가장 작다고 생각한다.
기왕 정면으로 안 된다면 거꾸로 해라.역방향 도면은 여전히 우선 대기열이고 토폴로지 순서 과정에서 가장 큰 점에 가장 큰 번호를 표시할 뿐이다.이렇게 욕심을 부리면 가장 잘 어울릴 수 있다.
코드
#include
using namespace std;
//#define LOCAL
const int maxn = 1e5+7;
struct Edge {
int to, nxt, dis;
}edge[maxn];
int head[maxn], tot;
int degree[maxn] = {}, v[maxn], n;
priority_queue q;
void init() {
tot = 0;
memset(head, -1, sizeof head);
memset(degree, 0, sizeof degree);
}
void addnode(int u, int v) {
++degree[v];
edge[tot].to = v;
edge[tot].nxt = head[u];
head[u] = tot++;
}
void topo_sort(int n) {
int cur = n;
for (int i = 1; i <= n; ++i)
if (!degree[i]) q.push(i);
while (!q.empty()) {
int u = q.top(); q.pop();
v[u] = cur--;
for (int i = head[u]; i != -1; i = edge[i].nxt) {
int v = edge[i].to;
--degree[v];
if (!degree[v]) q.push(v);
}
}
}
int main(){
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif
init();
int m; scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) v[i] = i;
for (int i = 0, u, v; i < m; ++i) {
scanf("%d%d", &v, &u);
addnode(u, v);
}
topo_sort(n);
for (int i = 1; i < n; ++i)
printf("%d ", v[i]);
printf("%d
", v[n]);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.