Codeforces Round #310 (Div. 2)

16919 단어 codeforces
A. Case of the Zeros and Ones
제목 대의:
0과 1만 포함하는 문자열을 주십시오. 0과 1이 인접하면 이 두 문자는 삭제할 수 있습니다. 마지막으로 삭제할 수 없는 문자는 몇 개입니까?
문제 해결 방법:
0과 1의 개수를 각각 집계한 뒤 상감한 절대치가 답이다.
 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <cmath>
 7 using namespace std;
 8 
 9 const int maxn = 200010;
10 const int INF = 0x3f3f3f3f;
11 int Fabs (int a, int b)
12 {
13     if (a > b)
14         return a - b;
15     return b - a;
16 }
17 int main ()
18 {
19     char str[maxn];
20     int n, a, b;
21     while (scanf ("%d", &n) != EOF)
22     {
23         a = b = 0;
24         scanf ("%s", str);
25         for (int i=0; i<n; i++)
26         {
27             if (str[i] == '0')
28                 a ++;
29             else
30                 b++;
31         }
32         printf ("%d
", Fabs(a , b)); 33 } 34 return 0; 35 }

B. Case of Fake Numbers
제목 대의:
하나의 서열은 n개의 수가 있는데 1부터 번호를 매긴다. 매번 서열에 대한 조작은 홀수와 짝수는 하나를 더하고 짝수는 하나를 줄인다. 유한한 조작을 거친 후에 0,1,2,3,4···········n-1의 서열을 구성할 수 있느냐고 묻는다.
문제 해결 방법:
이 서열의 수는 모두 [0, n-1] 구간 내의 숫자이기 때문에 이 서열은 반드시 n 횟수의 조작을 거친 후에 순환한다.
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1010;
 4 int a[maxn], b[maxn];
 5 int main ()
 6 {
 7     int n;
 8     while (scanf ("%d", &n) != EOF)
 9     {
10         int flag = 1;
11         for (int i=0; i<n; i++)
12         {
13             scanf ("%d", &a[i]);
14             if (i != a[i])
15                 flag = 0;
16         }
17         for (int j=0; j<n&&!flag; j++)
18         {
19             flag = 1;
20             for (int i=0; i<n; i++)
21             {
22 
23                 if (i % 2 == 0)
24                     a[i] = (a[i] + 1) % n;
25                 else
26                     a[i] = (a[i] + n - 1) % n;
27                 if (a[i] != i)
28                     flag = 0;
29             }
30         }
31         if (flag)
32             printf ("Yes
"); 33 else 34 printf ("No
"); 35 } 36 return 0; 37 }

 
C. Case of Matryoshkas
제목 대의:
n개의 귀엽고 아름다운 러시아 인형이 있는데, 번호는 1부터 시작하고, 번호가 큰 것은 번호가 작은 위에 씌울 수 있다. 그들은 귀엽기를 좋아하기 때문에 지금 그것들을 모두 끼워서 집으로 가져갈 것이다.
인형을 씌울 때는 두 가지 조작만 할 수 있다.
1:큰 인형 하나를 한 꿰미 또는 한 인형 위에 씌운다.
2:인형 한 송이를 한 줄의 가장 바깥쪽에서 떼어낸다.
-- 최소 몇 번 조작해야 인형을 집으로 데려갈 수 있나.
문제 해결 방법:
바로 시뮬레이션, 바로 미니.
 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <cmath>
 7 using namespace std;
 8 
 9 const int maxn = 100010;
10 const int INF = 0x3f3f3f3f;
11 
12 int main ()
13 {
14     int n, m;
15     while (scanf ("%d %d", &n, &m) != EOF)
16     {
17         int sum = m - 1, num, ans, a, b, c;
18         while (m --)
19         {
20             scanf ("%d", &num);
21             scanf ("%d", &c);
22             a = c;
23             ans = 0;
24             for (int i=1; i<num; i++)
25             {
26                 scanf ("%d", &b);
27                 if (b > a + 1 && ans == 0)
28                     ans = num - i;
29                 a = b;
30             }
31             if (c != 1)//                ,   ,     ,   wa       
32                 ans = num - 1;
33             sum += ans * 2;
34         }
35         printf ("%d
", sum); 36 } 37 return 0; 38 } 39 /* 40 9 3 41 3 7 8 9 42 3 1 2 3 43 3 4 5 6 44 45 */

 
뒤의 제목은 우리 아기가 정말 할 수 없군요. 아무래도 손이 모자라서 내일 꼭 제일 먼저 보충해 드리겠습니다~~~~~~~

좋은 웹페이지 즐겨찾기