10.2【LGR-161-Div.3】洛谷基础赛 #4

传送门

闲来无趣,索性打把比赛玩玩,也就当是复赛准备了。

TA P9686 Judg.

题目描述

传送门

小 M 正在兴致勃勃地敲打着代码,他突然发现提交代码的评测机无响应了。

你查看了后台数据,请你根据这些已有数据判断他没有通过的测试点有哪些。

已知评测结果与测试点是否通过有如下关系:

评测结果 测试点是否通过
\(\texttt{AC}\)
\(\texttt{WA}\)
\(\texttt{TLE}\)
\(\texttt{MLE}\)

输入格式

第一行输入一个正整数 \(n\),表示评测数据的个数。

\(2 \sim n+1\) 行,每行输入一个字符串,依次表示测试点 \(1\sim n\) 的评测结果,数据保证这些字符串一定为 \(\{\texttt{AC},\texttt{WA},\texttt{TLE},\texttt{MLE}\}\) 中的一个。

输出格式

输出一行 \(m\) 个正整数,其中第 \(i\) 个数字 \(a_i\) 表示第 \(a_i\) 个测试点没有通过。

特别地,你需要保证这 \(m\) 个数字递增。

样例 #1

样例输入 #1

5
AC
WA
AC
TLE
MLE

样例输出 #1

2 4 5

思路

这题目我不到一分钟就过了。

每次输入一个字符串\(s\),判断它是不是AC,如果不是,就把他的序号放到一个vector里,最后循环输出vector里的数字就行。

代码实现

#include<bits/stdc++.h>
using namespace std;
vector<int> a;
int main(){
	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		if(s!="AC"){
			a.push_back(i);
		}
	}
	for(int i=0;i<a.size();i++){
		cout<<a[i]<<" ";
	}
	return 0;
}

我紧接着来看了第二题,只能说是有点难度但不大。10分钟AC了。

TB P9687 Maps.

题目描述

传送门

小 Y 希望得到一幅地图,这份地图有些与众不同。

这份地图是一幅长为 \(n\) 个单位,宽为一个单位的网格图,每个网格必须被涂鸦成白色(\(0\))或者黑色(\(1\))。

你希望满足小 Y 的愿望送给他一幅这样的地图,但是这时小 Y 又提出了两点要求:

  • 对于每个不在网格图两端的白色格子,恰好有 \(p\) 个满足它的左右两个格子都被涂鸦成黑色。
  • 在满足上述所有条件的情况下,这幅地图从左到右的字符构成的字符串的字典序最小。

你心想,这些要求也是小菜一碟,于是开始了你的创作。

输入格式

本题有多组数据。

第一行一个正整数 \(T\),表示数据组数。

对于每组数据:

输入共一行两个整数 \(n,p\),表示你需要构造的地图的长度和小 Y 对你的要求。

输出格式

对于每组数据:输出一行一个长度为 \(n\) 的 01 字符串,表示你构造的地图;如果无法找到任何一幅地图满足小 Y 的要求,输出 \(-1\)

样例

样例输入

5
5 1
3 1
5 3
5 4
5 5

样例输出

00101
101
-1
-1
-1

思路

不知道你们理解了题目没有,我理解起来却很困难。

题目的大致意思是:一个长度为\(n\)bool数组上,有没有\(p\)个0点,满足他左右两个点都是1点的要求。如果是,输出满足条件且字典序最小的字符串,否则输出\(-1\).

通过分析样例,我们可以得出结论:\(n\)下取整整除2后的结果,如果大于\(p\),则一定是可以的,否则不行。

然后我们就要看如何得出字符串了。通过简单的分析后,便可以得出结论:字符串的前\(m/2-p\)个字符都是\(0\),这样可以满足字典序最小的要求。然后后面的数交替输出10101...就可以了。

代码实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
	int t;
	cin>>t;
	while(t--){
		int n,p;
		bool flag=0;
		cin>>n>>p;
		if(n%2==0&&(n-1)/2>=p){
			flag=1;
		}
		else if(n%2!=0&&n/2>=p){
			flag=1;
		}
		if(!flag){
			cout<<-1<<endl;
			continue;
		}
		int m=n;
		while(m>0){
			if(m/2>p){
				cout<<'0';
				m--;
			}
			if(m/2==p){
				cout<<'1';
				m--;
				for(int i=0;i<p;i++){
					cout<<"01";
				}
				break;
			}
		}
		cout<<endl;
	}
	return 0;
}

鄙人不才,后面的TC和TD都没写出来。

posted @ 2023-10-03 18:45  j1hx  阅读(129)  评论(0)    收藏  举报