2023/03/09刷题

链接

B - Equal Rectangles

这个题还是比较有意思的因为有4n个,我们可以发现我们如果把序列排序的话必然有两个数字肯定是一模一样的,因为是长方形的两个边,我们还可以发现排序之后第一个元素和倒数第一个元素相乘一定等于第二个元素和倒数第二个元素相乘,如果不相等之际打印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 = 500;

void solve() {
	int a[N] = {0};
	int n;
	cin >> n;
	for (int i = 1; i <= 4 * n; i++) {
		cin >> a[i];//读入数据
	}
	int flag = 1;//标志变量
	sort(a + 1, a + 4 * n + 1);//先排序
	vector <int> res;

	vector <int> b;

	for (int i = 2; i <= 4 * n; i = i + 2) {
		if (a[i] != a[i - 1]) {//判断排序之后相邻的两个数是不是一样的如果不一样打印no
			flag = 0;
			no;
			return;
		}


	}
	for (int i = 1; i <= 4 * n; i = i + 2) {
		b.push_back(a[i]);//因为有两个数是重复的所以我们只让一个数进入b数组
	}
	int j = b.size() - 1;
	for (int i = 0; i < j; i++, j--) {//i和j分别指向第一个和最后一个,向前遍历
		if (res.empty() == true) {//如果res为空直接放入
			res.push_back(b[i]*b[j]);

		} else {
			if (res.back() != b[i]*b[j]) {//后面每次判断等不等前面的那个
				flag = 0;//不等于flag=0
				break;
			} else {
				res.push_back(b[i]*b[j]);//否则将元素加入数组
			}


		}


	}


	if (flag == 1) {//打印结果
		yes;
	} else {
		no;

	}






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


	return 0;
}

链接

Vanya and Books

这个题题目很好懂直接找到规律直接计算,暴力肯定会超时,所以我们需要一些规律,求出最后的结果

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

signed main () {
	int n;
	cin >> n;
	string s = to_string(n);//转换成字符串便于计算位数
	double x = pow(10, (int)s.size() - 1);//构造和当前数字位数相同的数并且最小的数
	int ans = (n - x + 1) * s.size();//计算在当前位数的一种的位数的值加入到ans里面
	if (s.size() - 1 == 0) {//如果s只有一位的话,那么直接退出就可以了
		cout << ans << '\n';
		return 0;
	}
	int m;
	for (int i = 1;; i++) {//否则进入这个循环进行计算以后的位数
		n = pow(10, (int)s.size() - i);//计算s.size()-i位
		m = pow(10, (int)s.size() - i - 1);//计算s.size()-i-1位
		ans = ans + (n - m) * (s.size() - i);//n-m是有多少个这种数,s.size()-i是当前的位数
		if (m == 1) {//如果m的值唯一就该退出循环了
			break;
		}

	}



	cout << ans << '\n';//打印结果
	return 0;
}

A. TL

链接

A. TL

这个题还是比较有意思的和算法题的评测机制放在了一起.先对数组排序找到满足条件1,2,4的结果,然后判断一下能不能满足条件3,当满足了条件1,2,3,4的话,找到最小的那个值打印出来

#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 = 500;
int a[N], b[N];
signed main () {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= m; i++) {
		cin >> b[i];
	}
	sort(a + 1, a + n + 1);
	sort(b + 1, b + m + 1);//先对两个数组排序
	if (a[n] >= b[1]) {//如果a数组的最大值大于等于了b数组的最小值
		cout << -1 << '\n';//直接打印-1
		return 0;
	}
	int ans = b[1] - 1;//先定义结果为b[1]-1,保证满足条件1,2,4
	//下面来看条件3
	if (a[1] * 2 > ans) {//如果a里面最短的时间都不能满足条件3
		cout << -1 << '\n';//打印-1
	} else {
		//如果存在满足1,2,3,4的情况找到最下的那一个
		if (a[n] >= a[1] * 2) {
			//因为要满足所有的a数组通过我们看一下a[n]的大小
			//如果a[n] >= a[1] * 2)的话,
			ans = a[n];//ans设置为a[n]这样就是最小的
		} else {
			ans = a[1] * 2;//否则设置为a[1]*2这样是最小的
		}
		cout << ans << '\n';

	}




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