首页 > 其他分享 >2023/03/14刷题

2023/03/14刷题

时间:2023-03-17 21:22:06浏览次数:51  
标签:03 14 int cout long define yes include 刷题

A. IQ test

链接

A. IQ test

这个题就是给一个数数组,数组有两种情况。

  1. 要么有n-1个奇数和一个偶数
  2. 要么有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 = 105;

int a[N];
signed main () {
	int n;
	int st[3] = {0};
	scanf("%lld", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
		st[a[i] % 2]++;//统计奇数和偶数的数量
	}
	if (st[1] == 1) {//如果只有一个奇数的话
		for (int i = 1; i <= n; i++) {
			if (a[i] % 2 == 1) {//找到这个奇数并且打印出来
				cout << i << '\n';
				return 0;
			}
		}
	}
	if (st[0] == 1) {//如果只有一个偶数的话

		for (int i = 1; i <= n; i++) {
			if (a[i] % 2 == 0) {//找到这个偶数打印出来

				cout << i << '\n';
				return 0;
			}
		}

	}






	return 0;
}

A. Cut Ribbon

链接

A. Cut Ribbon

这个题两个加号忘了加括号,找了很久的bug服了..刚才有看了一下题目,发现只要是最后变成a,b,c就可以原来发现考虑多了,所以直接用双重循环枚举a,b的数量然后推出c的数量然后判断一下就可以解决了

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

int a[N];
signed main () {
	std::ios::sync_with_stdio(false);
//std::cin.tie(nullptr), std::cout.tie(nullptr);
	int n, a, b, c;

	cin >> n >> a >> b >> c;//读入

	int mmax = -999;
	for (int i = 0; i <= (4000 / a); i++) {//让4000/a减少一下循环次数
		for (int j = 0; j <= (4000 / b); j++) {//让4000/b同样的效果
		//n减去i个a和j个b使用的长度肯定要是大于0的才行
		//并且这个差值必须要对c取模等于0,
			if ((n - (i * a + j * b)) % c == 0 && (n - (i * a + j * b)) >= 0) {
//				cout<<i + j + ((n - i * a + j * b) / c) - 1<<'\n';
				mmax = max(i + j + (((n - (i * a + j * b))) / c), mmax);//然后使用max函数找到最大的值
			}
		}
	}
	cout << mmax << '\n';//打印出来
	




	return 0;
}

C. Registration system

链接

C. Registration system

这个题我原来使用了set但是不太好写,看了别人的想法发现别人的思路很好,就是用这个字符串映射到那个最后需要打印的值,如果有重的就让映射的值加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 = 105;

int a[N];
signed main () {
	std::ios::sync_with_stdio(false);
//std::cin.tie(nullptr), std::cout.tie(nullptr);
	int n;
	scanf("%lld", &n);
	string s;
	map<string, int> mp;//定义一个map
	for (int i = 1; i <= n; i++) {
		cin >> s;
		if (mp.empty() == true) {//如果map为空先让mp[s]=0
			mp[s] = 0;
			cout << "OK" << '\n';//打印ok
			continue;//循环继续
		}
		auto it = mp.find(s);//查找有没有s并且返回迭代器
		if (it != mp.end()) {//如果it不等于mp.end()
			string new_s = s + to_string(mp[s] + 1);//让这个s加上映射的值
			cout << new_s << '\n';//打印
			mp[s]++;//并且让这个值加1
		} else {
			mp[s] = 0; //如果没有这个迭代器,先映射上
			cout << "OK" << '\n';//打印ok
		}


	}




	return 0;
}

B. DZY Loves Strings

链接

B. DZY Loves Strings

这个题还是比较好做的,先统计原本的字符串的价值,然后找出26个值的最大值然后在后面加上,加上后面的值,最后打印出来

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


signed main () {
	string s;
	int x;
	int st[30] = {0};
	cin >> s;
	cin >> x;
	int mmax = -99999;
	for (int i = 0; i <= 25; i++) {
		cin >> st[i];
		if (st[i] > mmax) {
			mmax = st[i];//找出最大值
		}
	}
	int sum = 0;
	for (int i = 0; i < s.size(); i++) {
		sum = sum + st[s[i] - 'a'] * (i + 1);
	}//先统计原本的字符串的值
	//然后每次都用最大的mmax增加到字符串的后面,
	for (int i = s.size() + 1; i <= s.size() + x; i++) {
		sum = sum + i * mmax;
	}
	cout << sum << '\n';//最后打印sum





	return 0;
}

P1102 A-B 数对

链接

P1102 A-B 数对

这个题使用二分来做比较简单,先对a-b=c变形的a=b+c.然后使用一个循环和二分查找来找到所有的满足条件的值,最后打印出来

#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;
int a[N];

signed main () {
	int n, c;
	scanf("%lld %lld", &n, &c);
	for (int i = 0; i < n; i++) {
		scanf("%lld", &a[i]);
	}
	sort(a, a + n);//先排序
	int cnt = 0;//储存最后结果
	for (int i = 0; i < n; i++) {
		int l = -1, r = n;
		int x = c + a[i];//每次查找c+a[i]
		while (l + 1 != r) {
			int mid = (l + r) / 2;
			if (a[mid] < x) {//先以a[mid]<x为边界
				l = mid;
			} else {
				r = mid;
			}
		}//使用r
		if (a[r] == x) {//如果这个数存在
			int l1 = -1, r1 = n;
			while (l1 + 1 != r1) {
				int mid = (l1 + r1) / 2;
				if (a[mid] <= x) {//再以a[mid]<=x为
					l1 = mid;
				} else {
					r1 = mid;
				}
			}
			//返回l1
			cnt = cnt + l1 - r + 1;//加上这个区间之内的数,因为一个数可以和多个相同的不同下标的数配对


		}

	}

	cout << cnt << '\n';//打印结果


	return 0;
}

标签:03,14,int,cout,long,define,yes,include,刷题
From: https://www.cnblogs.com/harper886/p/17228194.html

相关文章