2023/03/04刷题

C. Andrew and Stones

链接

C. Andrew and Stones

这个题还是比较有意思的,每天再补

A. Array

链接

A. Array

这个题比较好做可以发现要想条件成立的话,必须存在一个0.所以要么最大的数是0,要么最大的数是负数,而且数组中肯定有负数。因为任何数乘以0都是0,所以我们分情况来讨论。

如果最大值是正数的话,第1行取排序后第一个值,这样一定是负数,第二行取最后一个值.这样一定是正数.剩下的个第三行,第三行一定是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 = 100 ;

/*
2
10 8
1 1 1 5 2 4 4 8 6 7
*/
void solve() {
	int n;
	cin >> n;
	int a[N] = {0};
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	sort(a + 1, a + n + 1);
	if (a[1] < 0) {
		cout << 1 << ' ' << a[1] << '\n'; //输出第一个负数
	}

	if (a[n] >= 1) { //如果最大的是正数
		cout << 1 << ' ' << a[n] << '\n'; //打印最大的正数
		cout << n - 2 << ' '; //剩下的都放在最后一行
		for (int i = 2; i <= n - 1; i++) {
			cout << a[i] << ' ';
		}
		cout << '\n';


	} else {
		cout << 2 << ' ' << a[n - 1] << ' ' << a[n - 2] << '\n'; //打印最后倒数第二和第三个负数
		cout << n - 3 << ' ' << a[n] << ' '; //打印剩下的n-3个数

		for (int i = 2; i <= n - 3; i++) {
			cout << a[i] << ' ';
		}
		cout << '\n';


	}





}
signed main () {
	std::ios::sync_with_stdio(false);

	solve();


	return 0;
}

B. Sifid and Strange Subsequences

链接

B. Sifid and Strange Subsequences

这个题看了题解才会,先对数组排序然后可以发现两个数最小的绝对值的差值肯定是排序后两个数之间,并且我们可以发现数组中最多只能有正整数(如果剩下的值的最小的差值比这个正数还大否则就不能包含正整数)

#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 = 100004 ;

/*
2
10 8
1 1 1 5 2 4 4 8 6 7
*/
void solve() {
	int n;
	cin >> n;
	int a[N] = {0};
	int zs = 0;
	int fs = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		if (a[i] <= 0) {
			fs++;
		}

		else if (a[i] > 0) {
			zs++;

		}

	}//统计正数和负数(包括0)

	int mmin = 9999999999;
	int res = 0;
	sort(a + 1, a + n + 1); //排序
	for (int i = 1; i <= n; i++) {
		if (a[i] > 0) {
			res = a[i]; //碰到正数保存下来然后退出
			break;
		} else {
			if (i != 1) { //不是正数和第一个,每次取两个元素的差值最小值
				mmin = min(abs(a[i] - a[i - 1]), mmin);
			}

		}
	}


	if (a[n] <= 0) { //最大的为0,直接输出n
		cout << n << '\n';
		return;
	}
	if (mmin >= res) { //最小差值大于第一个正数
		cout << fs + 1 << '\n'; //打印负数加1
	} else {
		//否则打印负数数量
		cout << fs << '\n';

	}









}
signed main () {
	std::ios::sync_with_stdio(false);

	int t;
	cin >> t;
	while (t--) {
		solve();

	}


	return 0;
}

B. Neighbor Grid

链接

B. Neighbor Grid

构造题,四个角构造为2,剩下的边缘构造为3,剩下的构造为4..如果初始时大于上面的数量打印no

#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 = 310;

void solve() {
	int a[N][N] = {0};
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> a[i][j];//输入数据

		}
	}
	//直接构造,大于对应数量打印no

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if ((i == 1 && j == 1) || (i == 1 && j == m) || (i == n && j == 1) || (i == n && j == m)) {
				if (a[i][j] > 2) {
					no;
					return;
				} else {
					a[i][j] = 2;
				}

			} else if (i == 1 || i == n || j == 1 || j == m) {
				if (a[i][j] > 3) {
					no;
					return;
				} else {
					a[i][j] = 3;

				}



			} else {
				if (a[i][j] > 4) {
					no;
					return;
				} else {
					a[i][j] = 4;


				}

			}
		}
	}
	yes;

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cout << a[i][j] << ' ' ;
		}
		cout << '\n';//输出结果

	}






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


	return 0;
}

A. Alyona and Numbers

链接

A. Alyona and Numbers

这个题用上午刚学的取余很好用,可以找到最多的可以组成的数量.最后打印结果

#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;

void solve() {
	int st1[10] = {0};

	int st2[10] = {0};
	int n, m;
	cin >> n >> m;
	int a;
	for (int i = 1; i <= n; i++) {
		a = i % 5;
		st1[a]++;//统计第一个数组,余数为0,1,2,3,4的数量
	}
	for (int i = 1; i <= m; i++) {
		a = i % 5;
		st2[a]++;;//统计第二个数组,余数为0,1,2,3,4的数量
	}
	int ans = 0;
	ans = ans + st1[0] * st2[0]; //对第一个和第二个数组余数为0的元素进行只有组合
	ans = ans + st1[1] * st2[4]; //余数1,余数4的元素进行组合
	ans = ans + st1[2] * st2[3]; //余数2,3进行组合
	ans = ans + st1[3] * st2[2]; //3,2进行组合
	ans = ans + st1[4] * st2[1]; //4.1进行组合
	cout << ans << '\n';
//打印结果





}
signed main () {


	solve();



	return 0;
}
posted @ 2023-03-04 22:57  harper886  阅读(12)  评论(0编辑  收藏  举报