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

信息素养复赛模拟 3


1:进攻 (剩余步数必须为偶数)

#include
using namespace std;
#define int long long
signed main(){
	int n, x, y;
	cin >> n >> x >> y;
	int dist = x + y;
	if(n >= dist){
		int left = n - dist;
		if(left % 2 == 0) cout << "Yes" << endl;
		else cout << "No" << endl; 
	} else{
		cout << "No" << endl;
	}
	return 0;
} 

2:花式完成作业(思维)

#include
using namespace std;
#define int long long
const int N = 110; 
pair<int, int> a[N];
signed main(){
	int n;
	cin >> n;
	int l = 0, r = 0; 
	for(int i = 1; i <= n; i ++){
		cin >> a[i].first >> a[i].second;
		if(a[i].first < 0) l ++;
		else if(a[i].first > 0) r ++;
	}
	sort(a + 1 , a + 1 + n);
	int ans = 0;
	if(l == r){
		for(int i = 1; i <= n; i ++){
			ans += a[i].second;
		}
	}else{
		if(l < r){
			for(int i = 1; i <= 2 * l + 1; i ++){
				ans += a[i].second;
			}
		}else{
			for(int i = n; i >= n - 2 * r; i --){
				ans += a[i].second;
			}
		}
	}
	cout << ans << endl;
	return 0;
} 

3:小树(时间戳 + 模拟)

#include
using namespace std;
#define int long long
const int N = 1e5 + 10;
pair<int, int> last[N];
int high[N];
signed main(){
	int n, m, k;
	cin >> n >> m >> k;
	for(int i = 1; i <= n; i ++){
		last[i] = {-1, -1};
	}
	int cnt = -1;
	for(int i = 1; i <= m; i ++){
		int op, x;
		cin >> op >> x;
		cnt ++;
		if(op == 1){
			if(last[x].first == -1){
				last[x] = {i, i + k - 1};
			}else if(i <= last[x].second){
				last[x] = {last[x].first, i + k - 1};
			} else if(i > last[x].second){
				high[x] += last[x].second - last[x].first + 1;
				last[x] = {i, i + k - 1};
			}
		} else if(op == 2){
			if(last[x].first == -1) continue;
			if(i > last[x].second){
				high[x] += last[x].second - last[x].first + 1;
				last[x] = {-1, -1}; 
			} else{
				high[x] += i - last[x].first;
				last[x] = {-1, -1};
			}
		} else{
			if(last[x].first != -1){
				if(i > last[x].second){
					high[x] += last[x].second - last[x].first + 1;
					last[x] = {-1, -1};
				} else{
					high[x] += i - last[x].first;
					last[x] = {i, last[x].second};
				}
			}
			cout << high[x] + cnt << endl;
		}
	} 
	return 0;
} 

4:比较字典序(string 二分)

#include
using namespace std;
#define int long long
signed main(){
	int n;
	cin >> n;
	vector<string> v1, v2; // 存字典序最小和字典序最大 
	for(int i = 1; i <= n; i ++){
		string s;
		cin >> s;
		sort(s.begin(), s.end()); // 字典序最小的情况 
		v1.push_back(s);
		reverse(s.begin(), s.end()); // 字典序最大的情况 
		v2.push_back(s); 
	}
	vector<string> v = v1; 
	sort(v1.begin(), v1.end());
	sort(v2.begin(), v2.end());
	for(int i = 0; i < n; i ++){
		string x = v[i]; // 第 i + 1 个字符串 
		string y = x;
		reverse(y.begin(), y.end());
		// x 是字典序最小 y 是字典序最大 
		int idx1 = lower_bound(v2.begin(), v2.end(), x) - v2.begin() + 1;
		int idx2 = upper_bound(v1.begin(), v1.end(), y) - v1.begin();
		cout << idx1 << ' ' << idx2 << endl; 
	} 
	return 0;
} 

5:位差 (模拟)

#include
using namespace std;
#define int long long
const int N = 1e5 + 10;
int a[N]; 
int solve(int x, int y){
	string s1 = to_string(x);
	string s2 = to_string(y);
	while(s1.size() < s2.size()){
		s1 = "0" + s1; 
	} 
	while(s2.size() < s1.size()){
		s2 = "0" + s2; 
	} 
	int res = 0;
	for(int i = 0; i < s1.size(); i ++){
		int x = (s1[i] - '0') - (s2[i] - '0');
		x = abs(x);
		res = res * 10 + x;
	}
	return res;
}
signed main(){
	int n;
	cin >> n;
	int ma = 0;
	for(int i = 1; i <= n; i ++){
		cin >> a[i]; 
		if(i > 1){
			ma = max(ma, solve(a[i], a[i - 1]));
		}
	}
	cout << ma << endl;
	return 0;
} 

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