2023/02/24刷题

B. Maximum Product

链接

B. Maximum Product

这个题因为只取5个数字,所以我们直接枚举5个数字的全部情况取出最大值就可以了

#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 = 2 * 100000;
const int ll_MAX = -9223372036854775807; //定义最小值

bool cmp(int a, int b) {
	return a > b;//从小到大排序

}
signed main () {
	ios::sync_with_stdio(false);
	int zs[N] = {0}, fs[N] = {0};
	//分成5种情况取最大值
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;

		int k1 = 0, k2 = 0;

		for (int i = 0; i < n; i++) {
			int a;
			cin >> a;
			if (a >= 0) {
				zs[k1++] = a;


			} else {
				fs[k2++] = a;
			}
			//分别统计正数包括0的个数和负数的个数


		}
		int res = -9223372036854775807;
		sort(fs, fs + k2);//负数从小到大排序
		sort(zs, zs + k1, cmp);//正数从大到小排序
		if (k1 >= 5) { //全是正数
			res = max(res, zs[0] * zs[1] * zs[2] * zs[3] * zs[4]);//取5个正数的最大值


		}
		if (k1 >= 4 && k2 >= 1) {//结果为负数,乘以负数的最大值,才能更大
			res = max(res, zs[0] * zs[1] * zs[2] * zs[3] * fs[k2 - 1]);

		}
		if (k1 >= 3 && k2 >= 2) {//结果为正数乘以负数的最小值
			res = max(res, zs[0] * zs[1] * zs[2] * fs[0] * fs[1]);
		}
		if (k1 >= 2 && k2 >= 3) {//结果为负数,乘以负数的最大值
			res = max(res, zs[0] * zs[1] * fs[k2 - 1] * fs[k2 - 2] * fs[k2 - 3]);
		}

		if (k1 >= 1 && k2 >= 4) {//结果为正,乘以负数最下值
			res = max(res, zs[0] * fs[0] * fs[1] * fs[2] * fs[3]);
		}


		if (k2 >= 5) {//,结果为负数,乘以负数最大值
			res = max(res, fs[k2 - 5] * fs[k2 - 4] * fs[k2 - 1] * fs[k2 - 2] * fs[k2 - 3]);
		}
		cout << res << '\n';//打印



	}



	return 0;
}

C. Double-ended Strings

链接

C. Double-ended Strings

枚举较短的那个全部的子串,然后直接长串里面寻找.找到一个更新一下最大值

#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 = 2 * 100005;

signed main () {
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while (t--) {
		string a, b;
		cin >> a >> b;
		if (a.size() > b.size()) {
			swap(a, b);//让a始终较小
		}
//		cout<<a<<'\n';
		int res = 0;
//		if(strstr(b.c_str(),a.c_str())!=NULL){
//			res=a.size();
//		}
		for (int i = 0; i < a.size(); i++) {
			for (int j = i + 1; j <= a.size(); j++) {
				string temp = a.substr(i, j - i);//枚举每一个字串
//			cout<<temp<<'\n';
				if (strstr(b.c_str(), temp.c_str()) != NULL) {
					res = max(res, j - i);//看一下能不能更新最大值

				}

			}
		}
//打印结果

		cout << (b.size() - res) + (a.size() - res) << '\n';



	}





	return 0;
}

B. Captain Flint and a Long Voyage

链接

B. Captain Flint and a Long Voyage

这个题还是比较有意思的可以发现9是1001而8是1000然后我们去掉最后n位数,可以发现我们让其全部等于就可以出现最大值,但是因为最后几位是要去除的但是我们要保证位数不变所以我们最后是8和9都可以,说以我们让n/4(4为1000和1001的长度)上取整,就可以得出有多少个8可以替换9

直接打印

#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 = 2 * 100005;

signed main () {
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		int x = (n + 4 - 1) / 4;//上取整

		int cnt;
		cnt = n - x;//cnt储存有几个9
		while (cnt--) {
			cout << 9;//打印9
		}
		cnt = x;//cnt现在储存有几个`8

		while (cnt--) {
			cout << 8;//打印


		}

		cout << '\n';








	}





	return 0;
}

C. Building Permutation

链接

C. Building Permutation

排序之后直接贪心一下,累加到res里面然后打印结果

#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 = 3 * 100005;
int a[N];
signed main () {
	ios::sync_with_stdio(false);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	int res = 0;
	sort(a + 1, a + 1 + n);//排序一下
	for (int i = 1; i <= n; i++) {
		//和当前的i进行比较
		if (a[i] > i) {//如果a[i]大于i加上差值
			res = res + a[i] - i;
		} else {
			res = res + i - a[i];//小于1的时候也加上差值
		}

	}
	cout << res;//打印结果







	return 0;
}

A. Jeff and Digits

链接

A. Jeff and Digits

这个题我们需要知道一个规律

image-20230224224133452

然后如果1-n个5加起来是9的倍数的话,将剩下的0放到最后就是最大

如果1-n个5加起来都不是9的倍数,打印-1,

如果没有5的倍数,但是有0打印0

#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 = 3 * 100005;
signed main () {
	ios::sync_with_stdio(false);
	int n;
	int a = 0, b = 0;
	int x;
	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> x;
		if (x == 5) {
			a++;
		} else {
			b++;
		}
	}
	//统计0和5的个数
	if (b == 0) {//0一个都没有打印-1
		cout << -1 << '\n';
		return 0;
	}
	int cnt = 0;//初始化为0
	for (int i = 1; i <= a; i++) {
		if ((i * 5) % 9 == 0) {//查找全部任意的5加起来有没有9的倍数
			cnt = max(cnt, i);//更新cnt
		}
	}
	if (cnt == 0) {//cnt没被更新打印0
		cout << 0 << '\n';

	} else {
		//否则打印结果

		while (cnt--) {
			cout << 5;

		}
		while (b--) {
			cout << 0;
		}

	}




	return 0;
}
posted @ 2023-02-24 22:48  harper886  阅读(18)  评论(0编辑  收藏  举报