제목 링크 : https://atcoder.jp/contests/abc189/tasks
A-슬롯
이야기
세 문자 만 포함 된 문자열을 입력합니다. 모두 같으면 "Won"을 출력하고, 그렇지 않으면 "Lost"를 출력합니다.
아이디어
물 문제.
ac 코드
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
string a; cin >> a;
if(a[0] == a[1] && a[0] == a[2]) puts("Won");
else puts("Lost");
return 0;
}
B-알코올
이야기
음주. n 병의 와인이 있고, 각 병은 aiml이고, 알코올 농도가 bi 일 때, Takahashi의 알코올 양은 m이고, 그다음에 그는 순서대로 마셔야합니다. 그리고 그가 술을 마실 때 어느 병을 마실 것인지 물어보세요. 술이 끝나고 술에 취하지 않았다면 (위는 다 담을만큼 크다!) -1이 출력된다.
아이디어
시뮬레이션. 병없는 와인의 알코올 함량 ai * bi를 계산 한 다음 알코올 함량이 m * 100을 초과 할 때까지 순차적으로 마신다.
ac 코드
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int a[maxn];
int main(){
int n, m;
cin >> n >> m;
m *= 100;
for(int i = 1; i <= n; i ++){
int x, y;
cin >> x >> y;
a[i] = x * y;
}
int ans = -1, id = 1;
while(id <= n){
m -= a[id];
ans = id ++;
if(m < 0) break;
}
if(m >= 0) ans = -1;
cout << ans << endl;
return 0;
}
C-만다린 오렌지
이야기
n 개의 숫자, 연산 (l, r, x)은 구간 [l, r]의 숫자를 나타내고 각 숫자는 x보다 크거나 같으며, s = x * (rl + 1)로 표시되는 값 및 조건이 충족 됨 s의 최대 값
아이디어
폭력. 각 위치에 대해 경계 값이이 값보다 작을 때까지 숫자가 좌우로 분산 된 다음 최대 값이 업데이트됩니다.
ac 코드
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e4 + 5;
int a[maxn];
int main(){
int n; cin >> n;
for(int i = 1; i <= n; i ++){
cin >> a[i];
}
int ans = 0;
for(int i = 1; i <= n; i ++){
int id = i + 1, l = i, r = i; //l,r分别代表扩展左右边界
while(id <= n && a[i] <= a[id]){
r = id ++;
}
id = i - 1;
while(id >= 1 && a[i] <= a[id]) {
l = id --;
}
ans = max(ans, a[i] * (r - l + 1)); //(l, r, x) 这里的a[i]就作为x, 区间长度是r - l + 1,所以代表的值就是a[i] * (r - l + 1)
}
cout << ans << endl;
return 0;
}
D-논리식
이야기
비트 연산에서 AND 연산과 OR 연산을 각각 나타내는 "AND"또는 "OR"의 n 개의 문자열을 제공 한 다음 "False"및 "True"만 포함하는 n + 1 길이를 구성 할 수 있습니다. n 개의 문자열로 구성된 표현식의 최종 결과를 만드는 시퀀스는 True입니다. 이러한 시퀀스가 몇 개 있는지 물어보십시오.
예를 들어, 샘플의 두 문자열 "AND", "OR"은 True & False | True = True이므로 구성된 시퀀스는 {True, False, True}가 될 수 있습니다. 이러한 시퀀스가 5 개 있고 출력 5
아이디어
dp의 재귀 식과 비슷합니다. 첫 번째 위치에서 i-1 번째 위치까지 연산 후 True의 개수가 a1로 초기화되어 1로 초기화되고 False의 개수가 a2로 초기화되었다고 가정합니다.
i 번째 위치의 연산이 AND이면 연산의 결과가 True이면 1 & 1 만, 즉 i 번째 위치의 연산 결과 수가 True이면 a1이고, 그렇지 않으면 연산 결과가 False이면 1 & 0, 0 & 1,0 & 0이 될 수 있습니다. 즉, i 번째 위치에 대한 False 결과의 수는 a1 + a2 + a2입니다.
마찬가지로 i 번째 위치의 연산이 OR이고 연산의 결과가 True이면 1 | 1, 1 | 0, 0 | 1이 될 수 있습니다. i 번째 위치의 결과가 True이면 a1 + a1 + a2이고, 그렇지 않으면 연산 결과가 False이면 0 | 0 만 될 수 있습니다. 즉, i 번째 위치에 대한 False 연산 결과의 수가 다음과 같음을 의미합니다. a2.
최종 결과는 재귀 a1입니다.
ac 코드
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e4 + 5;
string a[66];
int main(){
ll ans = 0;
int n; cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
ll a1 = 1, a2 = 1, t1, t2;
for(int i = 1; i <= n; i ++){
if(a[i] == "OR"){
t1 = a1 * 2 + a2;
t2 = a2;
}else{
t1 = a1;
t2 = a1 + a2 * 2;
}
a1 = t1, a2 = t2;
}
cout << a1 << endl;
return 0;
}