2023/03/11刷题

A. Minimizing the String

链接

A. Minimizing the String

这个题的意思就是删除一个字母让字符串的字典序变得最小,如果字符串的顺序是abcda的话很明显我们要删除d所以我们要删除如果字母的序号是递增的话,删除最后一个递增的字符就可以了,如果例如bbbbbbbbb这种全部相同的话,就删除最后一个,使用这种贪心的思路就可以

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no 	cout<<"NO"<<'\n'

using namespace std;
const int N = 200008;


signed main () {
	int n;
	cin >> n;
	string s;
	bool st[N] = {false};//标志变量,因为字符串不好直接删除
	cin >> s;
	int flag = 0;
	for (int i = 0; i < s.size() - 1; i++) {
		if (s[i] > s[i + 1]) {//如果前面的字符的值大于后面的话
			st[i] = true;//将s[i]标记为删除
			flag = 1;
			break;//我们只找第一个这样的数,所以直接退出
		}
	}
	if (flag == 0) {//没找到标记最后一个字符
		st[s.size() - 1] = true;
		for (int i = 0; i < s.size(); i++) {
			if (st[i] != true) {//打印
				cout << s[i];
			}
		}
	} else {
		for (int i = 0; i < s.size(); i++) {
			if (st[i] != true) {
				cout << s[i];//打印
			}
		}

	}





	return 0;
}

B. Ehab Is an Odd Person

链接

B. Ehab Is an Odd Person

这个题就是通过给定条件的构造能不能让这个数列从小到大排列,很明显肯定有规律,规律就是只要存在一个奇数和偶数就一定可以构造出来,否则就构造不出来

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no 	cout<<"NO"<<'\n'

using namespace std;
const int N = 100008;

int a[N];
signed main () {
	int n;
	int st[3] = {0};//记录奇数和偶数的数量
	scanf("%lld", &n);
	for (int i = 0; i < n; i++) {
		scanf("%lld", &a[i]);
		st[a[i] % 2]++;
	}
	if (st[0] >= 1 && st[1] >= 1) {//如果奇数和偶数的数量都超过一个
		sort(a, a + n);//排序一下
		for (int i = 0; i < n; i++) {
			printf("%lld ", a[i]);//打印
		}
	} else {//否则不能排序直接打印
		for (int i = 0; i < n; i++) {
			printf("%lld ", a[i]);
		}

	}

	return 0;
}

B. Absent Remainder

链接

B. Absent Remainder

这个题的思路还是比较清晰的,首先a%b的结果肯定是小于b的这是肯定的,所以我们找到数列里面最小的那一个数,然后用剩下的n-1个数和它配对肯定是可以满足条件的,这样问题就很简单了

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no 	cout<<"NO"<<'\n'

using namespace std;
const int N = 200005;

void solve() {
	int a[N] = {0};
	int n;
	scanf("%lld", &n);
	for (int i = 0; i < n; i++) {
		scanf("%lld", &a[i]);
	}
	sort(a, a + n); //先排序
	int t = n - 1; //我这里从最后一个向前打印n/2个结果
	for (int i = 0; i < n / 2; i++) { //打印n/2个结果
		cout << a[t--] << ' ' << a[0] << '\n'; //每次打印a[t]和a[0]并且向后移
	}





}
signed main () {
	int t;
	cin >> t;
	while (t) {
		solve();
		t--;
	}


	return 0;
}
/*
1
3
2 2 2
*/
posted @ 2023-03-12 19:35  harper886  阅读(12)  评论(0编辑  收藏  举报