Codeforces Round 983 (Div. 2) 练习情况(菜菜别喷)——
这次三题排名为2100多,b题wa2次,有望提高,d题由于没做过交互式题目,所以没继续深入,希望下次可以进前2000。
完成情况 : 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
多多关注,谢谢哥哥姐姐,我在努力,如有一起学习想上分伙伴 请加
更多推荐



所有评论(0)