列表

详情


NC21505. 铁路车厢内的学生

描述

铁路车厢里有N个座位。每个地方要么是空的,要么是被乘客占据的。
奥运会的大学队由a名学生程序员和b名学生运动员组成。现在请您安排他们在铁路车厢中的座位,要求是
不允许其中两个学生运动员或两个学生程序员坐在一起,并且最初有些座位是被陪审团成员(他们显然不是学生)占据的。
现在请你求出这个车厢最多可以安排的学生数量

输入描述

第一行包含三个整数n,a和b——火车车厢的座位总数、学生程序员人数和学生运动员人数。

第二行包含长度为n的字符串,由字符“.”和“*”组成。点表示相应的位置是空的。星号意味着相应的位置被陪审员占据。

输出描述

输出一个整数

示例1

输入:

5 1 1
*...*

输出:

2

说明:

*.AB*

示例2

输入:

6 2 3
*...*.

输出:

4

说明:

*BAB*B

示例3

输入:

11 3 10
.*....**.*.

输出:

7

说明:

B*ABAB**A*B

示例4

输入:

3 2 3
***

输出:

0

说明:

无法安排

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.9) 解法, 执行用时: 32ms, 内存消耗: 3716K, 提交时间: 2020-12-03 21:34:31

import re
n,a,b = map(int,input().split())
students = a+b 
s = input()
s = s + '*'
cnt = 0
for i in range(len(s)):
    if s[i] == '*' :
        while cnt > 1:
            cnt -= 2
            if a > 0 and b > 0:
                a -= 1
                b -= 1
            elif a > 0 :
                a -= 1
            elif b > 0:
                b -= 1
        if cnt != 0 and (a > 0 or b > 0):
            if a > b:
                a -= 1
            else:
                b -= 1
        cnt = 0
    else:
        cnt += 1
print(students-(a+b))

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 376K, 提交时间: 2020-10-14 15:41:13

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n,a,b;
	string in;
	cin>>n>>a>>b;
	cin>>in;
	int len=in.length();
	int po=0;
	int ans=0;
	// 等于len,解决最后一位为.情况 
	for(int i=0;i<=len;++i) { 
		if(in[i]=='.') {
			po++;
		} else {
			if(po) {
				if(a<b) swap(a,b);
				a=a-po/2-(po%2==1);
				b=b-po/2;
				ans+=po;
			}
			po=0;
		}
	}
	cout<<ans+(a<0?a:0)+(b<0?b:0)<<endl;
    return 0;
}

C++(g++ 7.5.0)(g++7.5.0) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2023-07-30 17:40:06

#include<iostream>
#include<stdio.h>
#include<algorithm>
#define ll long long int
using namespace std;
int main()
{
	int n,a,b;
	string s;
	cin>>n>>a>>b;
	cin>>s;
	int ans=0;
	int maxn=max(a,b),minx=min(a,b);
	for(int i=0;i<n;i++){
		if(s[i]=='.'&&maxn) {s[i]='*';i++;maxn--;ans++;}
	}
	for(int i=0;i<n;i++)
		if(s[i]=='.'&&minx) {ans++;minx--;}
	cout<<ans<<endl;
 	return 0;
}

C++ 解法, 执行用时: 6ms, 内存消耗: 464K, 提交时间: 2021-10-15 13:02:42

#include<iostream>
#include<stdio.h>
#include<algorithm>
#define ll long long int
using namespace std;
int main()
{
	int n,a,b;
	string s;
	cin>>n>>a>>b;
	cin>>s;
	int ans=0;
	int maxn=max(a,b),minx=min(a,b);
	for(int i=0;i<n;i++){
		if(s[i]=='.'&&maxn) {s[i]='*';i++;maxn--;ans++;}
	}
	for(int i=0;i<n;i++)
		if(s[i]=='.'&&minx) {ans++;minx--;}
	cout<<ans<<endl;
 	return 0;
}

上一题