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;
}
아, 피사체가 많은 블로그를하는 데 시간이 오래 아래로 복사, 다음 시간을 복사 할 수 없습니다.
기록 매운 닭 성장 :