A. Catch the Coin
#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn = 2e5 + 7 ;
inline ll read(){
ll x = 0 , f = 1 ;
char c = getchar() ;
while(c > '9' || c < '0'){
if(c == '-')
f = -1;
c = getchar() ;
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0' ;
c = getchar() ;
}
return x * f ;
}
ll a[maxn] , b[maxn] , t , n , m , k , l , r ;
char s[maxn] , S[maxn] ;
void solve(){
n = read() ;
for(int i = 1 ; i <= n ; i ++){
a[i] = read() ;
}
for(int i = 1 ; i <= n ; i ++){
b[i] = read() ;
}
ll s1 = 0 , s2 = 0 , cnt = 0 , sum = 0 ;
for(int i = 1 ; i <= n ; i ++){
if((a[i] < 0 && b[i] < 0)){
cnt ++ ;
continue ;
}
if(a[i] > 0 && b[i] > 0){
sum ++ ;
continue ;
}
if(a[i] == 1){
s1 ++ ;
continue ;
}
if(b[i] == 1){
s2 ++ ;
}
}
while(1){
if(sum <= 0){
break ;
}
if(s1 <= s2 && sum > 0){
s1 ++ ;
sum -- ;
continue ;
}
if(s1 > s2 && sum > 0){
s2 ++ ;
sum -- ;
continue ;
}
}
while(1){
if(cnt <= 0){
break ;
}
if(s1 <= s2 && cnt > 0){
s2 -- ;
cnt -- ;
continue ;
}
if(s1 > s2 && cnt > 0){
s1 -- ;
cnt -- ;
continue ;
}
}
// cout << s1 << " " << s2 <<endl ;
cout << min(s1 , s2) << endl ;
}
int main(){
t = read() ;
while(t --){
solve() ;
}
return 0 ;
}
B. Substring and Subsequence
题意:给你两个字符串,一个是子串,一个是子序列,这里就不过多赘述了,问能否找到一个字符串,保证包含a一定是子串,b一定是子序列?
题解:因为a是子串,所以a一定是固定的,我们只需要考虑b字符串,我们枚举b的位置,依次加入a,看看多少个在a中是没有的,统计出最小答案即可。这道题主要是数据很小,随便做都能过。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn = 2e5 + 7 ;
inline ll read(){
ll x = 0 , f = 1 ;
char c = getchar() ;
while(c > '9' || c < '0'){
if(c == '-')
f = -1;
c = getchar() ;
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0' ;
c = getchar() ;
}
return x * f ;
}
ll a[maxn] , t , n , m , k , l , r ;
char s[maxn] , S[maxn] ;
void solve(){
scanf("%s" , s + 1);
scanf("%s" , S + 1) ;
int len = strlen(s + 1) ;
int Len = strlen(S + 1) ;
ll Min = len + Len ;
for(int i = 1 ; i <= Len ; i ++){
ll rt = 1 , Rt = i ;
while(rt <= len){
if(s[rt] == S[Rt]){
rt ++ ;
Rt ++ ;
}
else{
rt ++ ;
}
}
Min = min(Min , ((ll)i - 1) + len + (Len - Rt) + 1) ;
}
cout << Min << endl ;
}
int main(){
t = read() ;
while(t --){
solve() ;
}
return 0 ;
}
C. Two Movies
题意:一共有两个电影,每个人看完两个电影以后都会给出一个打分,1,0,-1。每个人的打分只有一个是奏效的,我们能否找到一个选择打分的方式,使得影院的评分最高(影院的评分是两个电影的最低评分)。
题解:因为数字只有0,1,-1,那我们分别枚举情况,我们会发现,只有含有0,我们一定会选0,我们希望答案更大,所以不会选择-1来做负贡献,剩下的情况我们来看0,1的情况,那么肯定是选择1加到相应的影片上,最后就是1,1或-1,-1,我们可以把这两个数字单独统计,最后再加入两个影片的答案中,直接枚举加入即可,最后两个数字取min,这道题就迎刃而解了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
const int maxn = 2e5 + 7 ;
inline ll read(){
ll x = 0 , f = 1 ;
char c = getchar() ;
while(c > '9' || c < '0'){
if(c == '-')
f = -1;
c = getchar() ;
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0' ;
c = getchar() ;
}
return x * f ;
}
ll a[maxn] , b[maxn] , t , n , m , k , l , r ;
char s[maxn] , S[maxn] ;
void solve(){
n = read() ;
for(int i = 1 ; i <= n ; i ++){
a[i] = read() ;
}
for(int i = 1 ; i <= n ; i ++){
b[i] = read() ;
}
ll s1 = 0 , s2 = 0 , cnt = 0 , sum = 0 ;
for(int i = 1 ; i <= n ; i ++){
if((a[i] < 0 && b[i] < 0)){
cnt ++ ;
continue ;
}
if(a[i] > 0 && b[i] > 0){
sum ++ ;
continue ;
}
if(a[i] == 1){
s1 ++ ;
continue ;
}
if(b[i] == 1){
s2 ++ ;
}
}
while(1){
if(sum <= 0){
break ;
}
if(s1 <= s2 && sum > 0){
s1 ++ ;
sum -- ;
continue ;
}
if(s1 > s2 && sum > 0){
s2 ++ ;
sum -- ;
continue ;
}
}
while(1){
if(cnt <= 0){
break ;
}
if(s1 <= s2 && cnt > 0){
s2 -- ;
cnt -- ;
continue ;
}
if(s1 > s2 && cnt > 0){
s1 -- ;
cnt -- ;
continue ;
}
}
// cout << s1 << " " << s2 <<endl ;
cout << min(s1 , s2) << endl ;
}
int main(){
t = read() ;
while(t --){
solve() ;
}
return 0 ;
}
喜欢作者的记得点个关注哦~