信息素养复赛模拟 4 编程题标程

信息素养复赛模拟 4


1:三角形分割

思路:如果存在两个数横坐标相等和存在两个数纵坐标相等即无法切割成两个三角形

#include
using namespace std;
int main(){
	int t;
	cin >> t;
	while(t --){
		int a, b, c, d, e, f;
		cin >> a >> b >> c >> d >> e >> f;
		int res = 0;
		if(a == c || a == e || c == e) res ++;
		if(b == d || b == f || d == f) res ++;
		if(res == 2) cout << "NO" << endl;
		else cout << "YES" << endl; 
	}
	return 0;
} 

2:魔法塔

思路:将 2 - n 的元素 sort 完贪心

#include
using namespace std;
const int N = 1e4 + 10;
int a[N];
int main(){
	int t;
	cin >> t;
	while(t --){
		int n;
		cin >> n;
		for(int i = 1; i <= n; i ++){
			cin >> a[i];
		}
		sort(a + 2, a + 1 + n);
		for(int i = 2; i <= n; i ++){
			if(a[i] > a[1]){
				int gap = (a[i] + a[1] + 1) / 2 - a[1];
				a[1] += gap;
				a[i] -= gap;
			}
		}
		cout << a[1] << endl;
	}
	return 0;
} 

3:括号匹配 (栈)

思路:经典的括号匹配,唯一需要注意的是小括号不能包括大括号,判断一下即可。

#include
using namespace std;
int main(){
	string s;
	cin >> s;
	stack<char> stk;
	for(int i = 0; i < s.size(); i ++){
		if(s[i] >= 'a' && s[i] <= 'z'){
			if(stk.size() && stk.top() < s[i]){
				cout << "NO" << endl;
				return 0;
			} 
			stk.push(s[i]); 
		}else{
			if(stk.empty()){
				cout << "NO" << endl;
				return 0; 
			}
			if(stk.top() - 'a' + 'A' == s[i]){ // 匹配成功 
				stk.pop();
			}else{
				cout << "NO" << endl;
				return 0;
			}
		}
	} 
	if(stk.empty()){
		cout << "YES" << endl;
	}else cout << "NO" << endl;
	return 0;
} 

4:数字王国

#include
using namespace std;
int main(){ // 10 进制转 9 进制 
	int t;
	cin >> t;
	while(t --){
		long long n;
		cin >> n;
		long long res = 1;
		long long ans = 0;
		while(n){
			int x = n % 9;
			if(x >= 4) x ++;
			ans += res * x;
			res *= 10;
			n /= 9;
		} 
		cout << ans << endl;
	}
	return 0;
} 

5:仓鼠聚会 (二分答案)

#include
using namespace std;
#define int long long  
const int N = 2e5 + 10;
pair<int, int>a[N];
int n; 
bool check(int mid){
	int cnt = 0;
	for(int i = 1; i <= n; i ++){
		if(a[i].first >= mid - cnt - 1 && a[i].second >= cnt){
			cnt ++; 
		}
	}
	return cnt >= mid;
}
signed main(){
	int t;
	cin >> t;
	while(t --){
		cin >> n;
		for(int i = 1; i <= n; i ++){
			cin >> a[i].first >> a[i].second;
		}
		int l = 1, r = 1e9;
		while(l < r){ // 最大用模板2 
			int mid = l + r + 1 >> 1; 
			if(check(mid)) l = mid;
			else r = mid - 1; 
		} 
		cout << l << endl;
	}
	return 0;
} 

你可能感兴趣的:(算法,c++,数据结构)