[게임의 CF 레코드] Codeforces 라운드 # 605 (사업부. 3)

Div3 컵은 정말 폭력도 DIV2에 비해 폭력 그것 (이 명확하게 일을 표시하지 않음), 그래서 나를 위해이 같은 돌아서 긴 시간을 낭비하지 않았다 자신에 대한 문제로, 매우 귀찮은 건이며, 그 다음 내가 일어나 오는. 그런 다음이 실제로도에 나누어 ......

질문 : 폭발 FOUND

문제점 B : 문자열 간단한 탐욕

질문 C : 문자열, 간단한 수학

D 제목 : DP

A. 세 친구

테스트 당 시간 제한

1 초

시험 당 메모리 제한

256메가바이트

입력

표준 입력

산출

표준 출력

세 친구는 서로를 만날 것입니다. 초기 위치에서 제 친구 체류 \ (X = A \) 의 위치에서 제 친구 체류 \ (X = B \) 와 위치에서의 제 친구 체류 \ (X = C \) 에 축 좌표 \ (황소 \) .

1 분 동안 각각 독립적 친구 다른 친구들에 의해 위치 XX 변경 (1 \) \ 왼쪽 또는로 (\ 1) \ 우측으로 (즉, 집합 X = 1 \) \ (X 또는 \ (X를 : = X + 1 \) ) 또는 변경하지 마십시오.

친구의 각 쌍 사이의 거리의 합 -의는 총 페어 거리를 소개하겠습니다. a'a ', b'b'와 c'c은 '상응 첫 번째, 두 번째와 세 번째 친구의 마지막 위치하자. 이어서 페어 전체 거리이다 (| A'-B '| + | A'-C'| + | B'-C '| \) \ , \ (| x는 | \) 의 절대 값 (\ X \) .

친구는 그들이 최적으로 이동하는 경우가 도달 할 수있는 최소 총 페어 거리에 관심이 있습니다. 각각의 친구는 두 번 이상 더 이상 이동하지 않습니다 . 그래서 더 공식적으로, 그들은 1 분 후에 도달 할 수있는 최소 총 페어의 거리를 알고 싶어요.

당신은 대답 할 필요 (\ Q)를 \ 독립적 인 테스트 케이스.

입력

입력의 첫 번째 라인은 하나 개의 정수를 포함 \ (Q \) ( \ (1≤q≤1000 \) 테스트 케이스의 수 -)를.

다음 \ (Q \) 라인은 테스트 케이스에 대해 설명합니다. \ (I \) 번째 테스트 케이스는 세 개의 정수로 주어진다 \ (A, B \)\ (c \) ( \ (1≤a, B c≤10 ^ 9 \) 의 초기 위치 -) 첫째, 둘째 및 셋째 대응 친구. 친구의 위치는 동일 할 수있다.

산출

테스트 케이스를 들어 그것에 응답 인쇄 - 최소 전체 거리 페어 (친구의 각 쌍 사이의 거리의 최소 합) 친구 최적 자신의 위치를 변경하는 경우. 각각의 친구는 두 번 이상 더 이상 이동하지 않습니다 . 그래서 더 공식적으로, 당신은 그들이 1 분 후에 도달 할 수있는 최소 총 페어 거리를 찾을 수있다.

입력

8
3 3 4
10 20 30
5 5 5
2 4 3
1 1000000000 1000000000
1 1000000000 999999999
3 2 5
3 2 6

산출

0
36
0
0
1999999994
1999999994
2
4
//https://codeforces.com/contest/1272/problem/A
/*
    题意:
    a,b,c 三点位置都可以走一格或者不走
    求走后 |a′−b′|+|a′−c′|+|b′−c′| 的值最小
    所以三重遍历就可以搜索完了全部情况
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;

int T;
long long a, b, c;

int main()
{
    scanf("%d", &T);
    while(T--){
        scanf("%I64d %I64d %I64d", &a, &b, &c);
        long long A, B, C;
        long long ans = 0x3f3f3f3f3f3f3f3f; // 把 ans 放一个很大的数
        // 三重遍历
        for(long long i = -1; i < 2; i++){
            for(long long j = -1; j < 2; j++){
                for(long long k = -1; k < 2; k++){
                    A = a; B = b; C = c;
                    A += i; B += j; C += k;
                    ans = min(ans, llabs(A - B) + llabs(A - C) + llabs(B - C));
                }
            }
        }

        printf("%I64d\n", ans);
    }
    return 0;
}


B. 눈 보행 로봇

테스트 당 시간 제한

이초

시험 당 메모리 제한

256메가바이트

입력

표준 입력

산출

표준 출력

최근에 당신은 눈 보행 로봇을 구입하고 집으로 가져왔다. 가정 당신의 가정은 셀입니다 ((0,0) \) \ 무한 그리드.

또한이 로봇의 명령의 순서를 가지고있다. 그것은 문자열로 기록 \을 (\) 문자 'L', 'R', 'U'와 'D'로 구성. 로봇이 셀에있는 경우 (\ (X, Y) \) 지금, 그 인접 셀 (현재 명령어에 따라) 중 하나로 이동할 수있다.

  • 현재 명령어가 'L'인 경우, 로봇이 왼쪽으로 이동할 수 \ ((X-1, Y) \) ;
  • 현재 명령이 'R'인 경우, 로봇이 오른쪽으로 이동할 수있다 ((X + 1, Y) \) \ ;
  • 현재 명령어가 'U'이면, 로봇에 위로 이동할 수있다 ((X, Y + 1) \) \ ;
  • 현재 명령어가 'D'이면, 로봇에 아래쪽으로 이동할 수있다 (\ (X, Y-1) \) .

당신은 매뉴얼의 마지막 페이지에 경고를 눈치 챘 : 일부 셀이 로봇 방문하는 경우 ( 제외시켰다 \ ((0,0) \) )를 두 번 그것은 나누기.

명령들의 시퀀스는 유효 그렇다면 로봇 셀 시작 \ ((0,0) \) 수행 주어진 지시 방문없이 셀 이외 \ ((0,0) \) 둘 또는 그 이상의 시간과 양 말단 셀 내의 경로 \ ((0,0) \) . 또한 세포 \ ((0,0) \) 방문해야 최대 두 번 : 시작과 끝에 (경로가 다음 빈 상태 (empty)의 경우는 한 번만 방문). 예를 들어, 명령의 다음 순서는 유효한 것으로 간주된다 : "UD", "RL", "UUURULLDDDDLDDRRUU", 그리고 다음은 유효하지 않은 것으로 간주된다 : "U"(엔드 포인트가 아닌 ((0,0) \) \ 등) "UUDD"(셀 \ ((0,1) \) 를 두 번 방문).

지침의 초기 순서는, 그러나 유효하지 않습니다 수 있습니다. 당신은 다음과 같은 방법으로 재 프로그래밍하기로 결정 귀하의 로봇이 헤어지고 싶어하지 않는 : 당신이 다음 지침의 초기 시퀀스에서 (아마도 전부 또는 없음) 지침을 일부 제거 당신이 원하는대로 나머지 지침을 재 배열하고 켜집니다 로봇이 이동합니다.

당신의 작업은 가능한 한 초기 시퀀스에서 몇 가지 지침으로 제거하고 순서가 유효 있도록 남은 것들을 재 배열하는 것입니다. 당신이 얻을 수있는 최대 길이의 유효한 순서를보고합니다.

당신이 선택할 수 있습니다 어떤 지침을 나머지의 순서를 (당신은 스왑의 수 또는 메트릭 다른 유사한을 최소화 할 필요가 없습니다).

당신은 대답 할 필요 (\ Q)를 \ 독립적 인 테스트 케이스.

입력

입력의 첫 번째 라인은 하나 개의 정수를 포함 \ (Q \) ( \ (1≤q≤2⋅10 ^ 4 \) ) - 테스트 케이스의 수.

다음 \ (Q \) 라인은 테스트 케이스가 포함되어 있습니다. \ (I \) 번째 테스트 케이스는 문자열 SS 적어도 이루어진으로 주어지지 \ (1 \) 와 더 이상 \ (10 ^ 5 \) 문자 'L', 'R', 'U'및 ' D '- 지침의 초기 시퀀스.

그것은의 합이 보장됩니다 (|의 | \) \ (여기서는 \ (| |에요 \) 모든 테스트 케이스를 통해 105,105을 (초과하지 않는 SS의 길이가) \ (Σ는 |) \ ≤10 ^ 5 |에요 ).

산출

각 테스트 케이스의 경우 그것에 대한 답을 인쇄 할 수 있습니다. 첫 번째 줄에 나타나는 지시의 최대 번호를 인쇄 할 수 있습니다. 두번째 라인에서 로봇이 수행하는 TT 나머지 명령들의 올바른 시퀀스를 출력한다. 움직임은 인쇄 시퀀스의 순서로 좌측에서 우측으로 행해진 다. 여러 가지 답이있는 경우, 당신은 어떤을 인쇄 할 수 있습니다. 대답은 경우 (0 \) \ , 당신은 빈 줄을 인쇄 할 수 있습니다 (하지만 당신은 그것을 인쇄되지 않습니다 수 있습니다.)

입력

6
LRU
DURLDRUDRULRDURDDL
LRUDDLRUDRUL
LLLLRRRR
URDUR
LLL

산출

2
LR
14
RUURDDDDLLLUUR
12
ULDDDRRRUULL
2
LR
2
UD
0

노트

"LR"와 "RL": 첫 번째 테스트 케이스 만 두 가지 가능한 답이 있습니다.

제 2 테스트 케이스에 대응하는 포토 :

트래버스의 방향이 중요하지 않습니다

세 번째 테스트 케이스의 또 다른 정답 : "URDDLLLUURDR".

// https://codeforces.com/contest/1272/problem/B
/*
    题意:
    有一串操作指令:上下左右
    要求用这些操作指令从(0,0)出发然后走完后就回到(0,0)
    在走的过程中不能走回头路(即不能走到相同位置上,(0,0)除外)
    且要走的路要最长

    那简单,用合理的指令走最大的环就行
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int T;
char ch[100005];
int u, d, l, r; // 记录原本的上下左右键

int main()
{
    scanf("%d", &T);
    while(T--){
        u = d = r = l = 0;
        scanf("%s", ch);
        int len = strlen(ch);
        for(int i = 0; i < len; i++){
            if(ch[i] == 'U') u++;
            else if(ch[i] == 'D') d++;
            else if(ch[i] == 'R') r++;
            else l++;
        }

//        printf("u:%d d:%d l:%d r:%d\n", u, d, l, r);
        if(u == 0 || d == 0){ // 不能往上或往下走
            if(r == 0 || l == 0) printf("0\n");
            else {
                printf("2\nLR\n");
            }
        }
        else if(l == 0 || r == 0){ // 不能往左走或往右走
            if(u == 0 || d == 0) printf("0\n");
            else {
                printf("2\nUD\n");
            }
        }
        else {
            int y = min(d, u);
            int x = min(l, r);
            printf("%d\n", (x + y) * 2); // 画个环
            for(int i = 0; i < y; i++) printf("U");
            for(int i = 0; i < x; i++) printf("L");
            for(int i = 0; i < y; i++) printf("D");
            for(int i = 0; i < x; i++) printf("R");
            printf("\n");
        }
    }
    return 0;
}


C. 또 다른 브로큰 키보드

테스트 당 시간 제한

이초

시험 당 메모리 제한

256메가바이트

입력

표준 입력

산출

표준 출력

최근, 노르웨이는 문자열 발견 \ (S = s_1s_2 ... s_n \) 구성을 \ (N \) 라틴어 소문자. 자신의 타이핑 속도를 향상시킬 수있는 운동으로, 그는 문자열의 모든 문자열을 입력하기로 결정했다 \ (들 \) . 예, 모든 \ (\ FRAC {N (N + 1)} {2} \) 그들 중!

의 하위 \ (들 \) 비어 문자열 \ (X = S [A ... B = s_as_ {A + 1} ... s_b \) ( \ (1≤a≤b≤n \) ). 예를 들어, "자동차"와 "t"는 "자동 기계"의 문자열입니다.

바로 운동 시작 후, 노르웨이는 자신의 키보드가 즉, 그는 단지 사용할 수, 깨진 것을 깨달았다 \ (K \) 라틴어 문자 (한 c_1, C_2, ..., C_K \) \ 의 아웃 (26 \) \ .

그 후, 노르웨이는 문자열의 얼마나 많은 부분 문자열에 관심을 갖게 \을 (\) 그는 여전히 그의 부러진 키보드를 사용하여 입력 할 수 있습니다. 이 번호를 찾기 위해 그를 도와주세요.

입력

첫 번째 라인은 두 개의 공간 분리 된 정수를 포함 \ (n \)\ (K \) ( \ (1≤n≤2⋅10 ^ 5 \) , \ (1≤k≤26 \) ) -의 길이 문자열 \을 (\) 와 키보드를 계속 사용할 라틴어 문자의 수.

두 번째 줄은 문자열이 포함 \을 (\) 정확히 구성을 \ (N \) 라틴어 소문자.

세 번째 라인은 KK 공백으로 구분 된 별개의 라틴 소문자 포함 \ (C1, C2를, ..., CK \) - 키보드의 문자를 계속 사용할.

산출

만 사용할 문자를 사용하여 입력 할 수 SS의 문자열의 수 - 하나의 숫자 인쇄 \ (C1, C2, ..., CK를 \) .

입력

7 2
abacaba
a b

산출

12

입력

10 3
sadfaasdda
f a d

산출

21

입력

7 1
aaaaaaa
b

산출

0

노트

첫 번째 예에서는 노르는 문자열을 인쇄 할 수 \ (S [1 ... 2 \) , \ (S [2 ... (3)] \) , $ S [1 ... 3 $, \ (S [1 ... 1] \) , \ (S [2 ... 2 \) , \ (S [3 ... 3] \) , \ (S [5 ... 6] \) , \ (S [6 ... 7] \) , \ (S [5 ... 7] \) , \ (S [5 ... 5] \) , \ (S [6 ... 6] \) , \ (S [7 ... 7] \) .

// https://codeforces.com/contest/1272/problem/C
#include<iostream>
#include<cstdio>
using namespace std;

/*
    题意:
    有一串字符串
    你的键盘可以输入 k 个字符
    问用这个 k 个字符可以写多少个字符串满足远字符串的子序列
    样例一:
    7 2
    abacaba
    a b
    用 a b 可以组成 12 种

    分析:
    原字符粗前面的 "aba" 就可以分为 6 种 后面的 "aba" 就可以组成 6 种
    分析一下,当可写的字符串长度为 n 时,满足 n * (n - 1) * (n - 2) * ... * 2 * 1 = n * (n + 1) / 2
    然后把这每一段的 (n) 加一起就可以(注意越界)
*/
int n, k;
char s[200005];
char ch[30];

int main()
{
    cin >> n >> k;
    cin >> s;
    for(int i = 0; i < k; i++) cin >> ch[i];

    long long ans = 0;
    long long len = 0;
    bool flag;
    for(int i = 0; i < n; i++){
//        printf("i:%d s:%c\n", i, s[i]);
        flag = false;
        for(int j = 0; j < k; j++){
//            printf("j:%d s:%c ch:%c\n", j, s[i], ch[j]);
            if(s[i] == ch[j]){
                flag = true;
                len++;
                break;
            }
        }
//        printf("i:%d len:%d flag:%d\n", i, len, flag);
//        printf("\n");
        if(!flag || i == n - 1){
            ans += (len + 1) * len / 2;
            len = 0;
        }
    }


    printf("%I64d\n", ans);

    return 0;
}


D. 제거를 한 요소

테스트 당 시간 제한

이초

시험 당 메모리 제한

256메가바이트

입력

표준 입력

산출

표준 출력

당신은 윈 정수로 구성된 배열 AA를 부여됩니다.

당신은 제거 할 수 있습니다 대부분 하나의에서 이 배열에서 요소입니다. 따라서, 어레이의 최종 길이는 \ (N-1 \) 또는 (\ n \) .

당신의 작업은 가능한 최대 길이를 계산하는 것입니다 엄격하게 증가하고 나머지 배열의 연속 된 부분 배열을.

리콜 RR에 LL에서의 인덱스와 인접 서브 어레이 단이라고 \ (a [1 ... R = a_l \) , \ (A_ {1 + 1}, ..., a_r \) . 서브 어레이 \ (a [1 ... R은] \) 증가 엄격 호출되면 \ (a_l <A_ {1 + 1} <⋯ <a_r \) .

입력

입력의 첫 번째 라인은 하나 개의 정수를 포함 \ (n \) ( \ (2≤n≤2⋅10 ^ 5 \) ) - 요소의 수 (a \) \ .

입력의 두 번째 라인은 포함 (n \) \ 정수 \ (A_1, A_2, ... a_n \) ( \ (1≤ai≤10 ^ 9 \) ) 여기서 \ (A_I \)\ (I \ ) 의 번째 요소 \ (\) .

산출

하나 개의 정수를 인쇄 -의 최대 가능 길이 엄격 증가 어레이 AA의 인접 서브 어레이를 하나 개의 소자에서 대부분의 제거 후.

입력

5
1 2 5 3 4

산출

4

입력

2
1 2

산출

2

입력

7
6 5 4 3 2 4 3

산출

2

노트

첫 번째 예에서는 삭제할 수 있습니다 (a_3 = 5 \) \ . 이어서 얻어진 배열은 [1,2,3,4] [1,2,3,4] 및 최대 증가 배열의 길이는 동일 할 것 같다 것이다 \ (4 \) .

// https://codeforces.com/contest/1272/problem/D
#include<iostream>
#include<cstdio>
using namespace std;
/*
    题意:
    可以剔除一个数或者不剔除
    求操作或者不操作后最长的升序子序列长度
*/
// dp[][0] 表示没有剔除时当前位置的最长上升子序列
// dp[][1] 表示剔除一个数之后当前位置的的最长上升子序列
int dp[200005][2];
int n, num[200005];
int ans;
//10
//1 2 5 4 3 8 9 4 8 10
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &num[i]);
        dp[i][0] = 1; // 每一位最短长度是 1
    }
    for(int i = 2; i <= n; i++){
        if(num[i] > num[i - 1]) {
            dp[i][0] = dp[i - 1][0] + 1;
            dp[i][1] = dp[i - 1][1] + 1; // 因为第 1 位剔除了,所以从 0 开始
        }
        if(num[i] > num[i - 2]){
            dp[i][1] = max(dp[i][1], dp[i - 2][0] + 1); // 每次与 dp[i - 2][0] 相比,符合只剔除一个数的规则
        }
        ans = max(ans, max(dp[i][1], dp[i][0])); // 每次比较当前位以得到最长上升子序列长度
    }
//    for(int i = 1; i <= n; i++){
//        printf("i:%d zero:%d one:%d\n", i, dp[i][0], dp[i][1]);
//    }
    printf("%d\n", ans);
    return 0;
}


아, 피사체가 많은 블로그를하는 데 시간이 오래 아래로 복사, 다음 시간을 복사 할 수 없습니다.

기록 매운 닭 성장 :

추천

출처www.cnblogs.com/Ayanowww/p/12039928.html