完成情况 : a,b,c 三题

A. Circuit

思路:

典型开关问题,根据题意,一个灯泡可以由两个开关控制,那么分论讨论

求最小值:

、1.如果1的数量是偶数个,那么可以让偶数个1对半分连接灯泡,这个可以让开的数量 到0 ​

     2.如果1的数量是奇数个,那么就在偶数的情况下剩余一个出来,那么答案是1

求最大值

        1.如果1的数量少于n,那么可以打开1的数量的灯(灯泡分别和1,0匹配)

        2.如果1的数量大于n,那么大于n个的部分必须和1配对,那么答案为one - (one-n)

贴代码

#include<bits/stdc++.h>
#define ll long long
#define int long long
#define inf 1e18
#define endl "\n"
#define PII pair<int,int>
#define fi first
#define se second
using namespace std;
const int mod = 998244353;
const int maxn = 2e5 + 100;
int qui(int n, int k) {
	int res = 1;
	while (k) {
		if (k & 1) {
			res = res * k;
		}
		n = n * n;
		k >>= 1;
	}
	return res ;
}
void solve() {
	int n;
	int one = 0;
	cin >> n;
	for (int i = 1 ; i <= n * 2 ; i++) {
		int x ;
		cin >> x;
		if (x == 1) {
			one ++ ;
		}
	}
	if (one & 1) {
		cout << 1 << " " ;
	} else {
		cout << 0 << " ";
	}
	if (one <= n) {
		cout << one << "\n";
	} else {
		int s = one - n;
		cout << n - s << "\n";
	}
}

signed main() {
	std :: ios :: sync_with_stdio( false);
	std :: cin.tie(0), std::cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

B. Medians

        

  题目分析:

·        题目分析的非常复杂,其实表达的意思是 一个数组是1~n的序列的数组,让你分成m个奇数数量的区间,然后符合要求这m个区间的中位数为 k ,注意:说的是m个区间每个的中位数拆开,这m个数的中位数为k

 思路分析

        由此一看就是一个简单的构造题,因为这个数组是有序的,先考虑不符合题目的情况:

                 当k == 1 ||k == n 时,此时要最小的或者最大的那个数成为中位数,可知不可能创建的 出这个区间

                  特殊情况判断:当n == 1 && k == 1 时,此时可以知答案就是1,因为只有一个数

                  普遍情况判断:我们可以创建 m = 3 的三个区间,中间的区间 的中位数为k的区间

此时 当(k-1)为奇数时 可以知道左边k-1为奇数个数,k +1 ~ n为奇数个数,符合题目要求,此时可以构建,1~k-1,k , k +1~n 三个区间

        当(k-1)为偶数时,此时1~k-1 和 k + 1 ~n 为奇数个,不符合题目要求,我们可以构造1~k-2,k-1 ~ k + 1 ,k + 2~n 三个区间让区间个数变成奇数

代码贴

#include<bits/stdc++.h>
#define ll long long
#define int long long
#define inf 1e18
#define endl "\n"
#define PII pair<int,int>
#define fi first
#define se second
using namespace std;
const int mod = 998244353;
const int maxn = 2e5 + 100;
int qui(int n, int k) {
	int res = 1;
	while (k) {
		if (k & 1) {
			res = res * k;
		}
		n = n * n;
		k >>= 1;
	}
	return res ;
}
void solve() {
	int n, k;
	cin >> n >> k;

	if (n == 1 && k == 1) {
		cout << 1 << "\n" << k << '\n';
		return ;
	}
	if (k >= n || k == 1) {
		cout << "-1" << "\n";
		return ;
	}
	cout << 3 << "\n";
	if ((k - 1) % 2 == 1)
		cout << 1 << " " << k << " " << k + 1 << "\n";
	else {
		cout << 1 << " " << k - 1 << " " << k + 2 << "\n";
	}
}

signed main() {
	std :: ios :: sync_with_stdio( false);
	std :: cin.tie(0), std::cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

    C. Trinity

题目分析 :

        求最少次数让整个数组满足取出三个数,三个数符合构造出三角形,即 ax+ay>az , ay+az>ax 和 az+ax>ay

思路分析

        对数组排序,从小往大枚举最小值和次小值的符合三角形的数的最大下标(用二分),统计出不符合三角形的个数,即 n - pos + i - 1,然后更新ans值

代码贴

#include<bits/stdc++.h>
#define ll long long
#define int long long
#define inf 1e18
#define endl "\n"
#define PII pair<int,int>
#define fi first
#define se second
using namespace std;
const int mod = 998244353;
const int maxn = 2e5 + 100;
int qui(int n, int k) {
	int res = 1;
	while (k) {
		if (k & 1) {
			res = res * k;
		}
		n = n * n;
		k >>= 1;
	}
	return res ;
}
void solve() {
	int n ;
	cin >> n ;
	vector<int> a(n);
	for (int i = 0 ; i < n ; i++) {
		cin >> a[i];
	}
	sort(a.begin(), a.end());
	int ans = inf;
	for (int i = 1 ; i < n ; i++) {
		int pos = lower_bound(a.begin(), a.end(), a[i] + a[i - 1]) - a.begin();
		ans = min(ans, n - pos + i - 1);
	}
	cout << ans << "\n";
}

signed main() {
	std :: ios :: sync_with_stdio( false);
	std :: cin.tie(0), std::cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

总结分析

这次三题排名为2100多,b题wa2次,有望提高,d题由于没做过交互式题目,所以没继续深入,希望下次可以进前2000

多多关注,谢谢哥哥姐姐,我在努力,如有一起学习想上分伙伴 请加

 

Logo

集算法之大成!助力oier实现梦想!

更多推荐