题目链接:https://atcoder.jp/contests/abc189/tasks
A - Slot
题目大意
输入一个串,只包含三个字符,如果都相同,输出“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 - Alcoholic
题目大意
喝酒。有n瓶酒,每瓶酒ai毫升,酒精浓度时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 - Mandarin Orange
题目大意
n个数,操作(l, r, x)表示区间[l, r]里面的数,满足每个数都大于等于x,代表的值s = x * (r - l + 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 - Logical Expression
题目大意
给你n个字符串,要么是"AND",要么是"OR",分别代表位运算中的与运算和或运算,然后让你构造长度为n+1的仅包含"False"和"True"的序列,使得带入n个字符串组成的运算式最终结果是True,问你这样的序列有几个。
比如样例的2个串"AND","OR",那么构造的序列可以是{True, False, True},因为 True & False | True = True。这样的序列有5个,则输出5
思路
有点像dp的递推式,假设从第1个位置到第i-1个位置做运算之后结果是True的数量为a1初始化是1,结果是False的数量为a2初始化是1。
如果第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;
}