我是靠谱客的博主 时尚小蜜蜂,最近开发中收集的这篇文章主要介绍Educational Codeforces Round 131 (Rated for Div. 2)一、A - Grass Field二、B - Permutation三、C - Schedule Management四、补:D - Permutation Restoration,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 一、A - Grass Field
- 二、B - Permutation
- 三、C - Schedule Management
- 四、补:D - Permutation Restoration
一、A - Grass Field
- 题目:
给你两行两列的表格,表格只有1和0,每次可以删除一行和一列的1,问你最少几次使得表格里面没有1 - 思路:
观察到当表格中1的个数 <=3时只用一次就行,(如果1的个数是0个的话,就是0次),否则如果表格中的1个个数是4个的话就是2次 - 代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl 'n'
#define all(x) x.begin(),x.end()
#define pb push_back
#define PII pair<int,int>
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define int long long
using namespace std;
const int N = 2e5 + 100,M = N * 2,mod = 1e9 + 7,INF = 0x3f3f3f3f;
void solve()
{
int a,b,c,d,e = 0;
cin >> a >> b >> c >> d;
if(a == 1) e++;
if(b == 1) e++;
if(c == 1) e++;
if(d == 1) e++;
if(e == 0) cout << "0" << endl;
else if(e <= 3) cout << "1" << endl;
else cout << "2" << endl;
}
signed main()
{
ios;int T; cin >> T;
while(T -- ) solve();
return 0;
}
二、B - Permutation
- 题目:
你可以选择一个k,和一个排列来使得这个排列中 A[i] * k = A[i + 1]的个数尽量多,输出k和这个排列 - 思路:
明确k的取值,贪心发现k越小越好,越小可能的取值就越多,k不能取1,取1就一个也没有,那就取2就好,然后从小到大枚举每一个数字就行 - 代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl 'n'
#define all(x) x.begin(),x.end()
#define pb push_back
#define PII pair<int,int>
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define int long long
using namespace std;
const int N = 2e5 + 100,M = N * 2,mod = 1e9 + 7,INF = 0x3f3f3f3f;
bool st[N];
void solve()
{
int n; cin >> n;
cout << "2" << endl;
memset(st,0,sizeof st);
for(int i = 1;i <= n;i ++ )
{
if(!st[i])
{
cout << i << ' ';
st[i] = true;
for(int j = i * 2;j <= n;j = j * 2)
{
if(!st[j])
{
st[j] = true;
cout << j << ' ';
}
}
}
}
cout << endl;
}
signed main()
{
ios;int T; cin >> T;
while(T -- ) solve();
return 0;
}
三、C - Schedule Management
- 题目:
有n个人,m个任务,然后每个任务由特定的人来做是花费一个小时,否则花费两个小时,然后给你一个长度是m的数组,数组中的值A[i]是这个任务指定的特定的人,问你最少多长时间能把任务做完 - 思路:
统计每个人做的任务的个数B[i],然后考虑二分时间,如果当前二分的时间mid,满足条件的话,就缩小,否则放大,条件内容:如果当前的这个人做的任务个数是 <= mid,那这个人在剩余的时间里面可以帮助其他 人完成的任务个数是(mid - B[ i ]) / 2,用一个变量cnt 来统计这个个数,否则这个人目前的剩余任务是B[i] - mid,然后判断cnt是否大于B[i] - mid,大于代表别人可以帮成功,否则的话就失败 - 代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl 'n'
#define all(x) x.begin(),x.end()
#define pb push_back
#define PII pair<int,int>
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define int long long
using namespace std;
const int N = 2e5 + 100,M = N * 2,mod = 1e9 + 7,INF = 0x3f3f3f3f;
int a[N],b[N];
int n,m;
bool check(int mid)
{
int cnt = 0;
for(int i = 1;i <= n;i ++ )
{
if(b[i] - mid <= 0)
{
cnt += (mid - b[i]) / 2;
}
else
{
int u = b[i];
u -= mid;
if(cnt >= u)
{
cnt -= u;
}
else
{
return false;
}
}
}
return true;
}
void solve()
{
cin >> n >> m;
for(int i = 1;i <= m;i ++ ) cin >> a[i],b[a[i]]++;
sort(b + 1,b + 1 + n);
int l = 1,r = b[n];
while(l <= r)
{
int mid = l + r >> 1;
if(check(mid)) r = mid - 1;
else l = mid + 1;
}
cout << l << endl;
for(int i = 1;i <= n;i ++ ) b[i] = 0;
}
signed main()
{
ios;int T; cin >> T;
while(T -- ) solve();
return 0;
}
四、补:D - Permutation Restoration
- 题目:
B[i] = i / A[i],给你B,让你求A,都是排列 - 思路:
B[i] <= i / A[i] < B[i] + 1 ,转换一下就有 i / ( B[i] + 1 ) + 1<= A[i] <= i / B[i],左端点 L= i / ( B[i] + 1 ) + 1,右端点R = i / B[i], 注意如果B[i] = 0,R就是n,然后从左到右枚举左端点,然后找右端点最小的那一个就行,满足的是贪心思想,右边越短留给后面的选择就越多, 详细可阅这个连接 - 代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl 'n'
#define all(x) x.begin(),x.end()
#define pb push_back
#define PII pair<int,int>
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define int long long
using namespace std;
const int N = 5e5 + 100,M = N * 2,mod = 1e9 + 7,INF = 0x3f3f3f3f;
int a[N],b[N];
int n,m;
vector<PII> res[N];
priority_queue<PII,vector<PII>,greater<PII> > q;
void solve()
{
cin >> n;
for(int i = 1; i <= n;i ++ ) cin >> b[i];
for(int i = 1;i <= n;i ++ )
{
int L = i / (b[i] + 1) + 1;
int R = (b[i] == 0) ? n : i / b[i];
res[L].pb({R,i});
}
for(int i = 1;i <= n;i ++ )
{
for(PII p : res[i]) q.push(p);
PII t = q.top();q.pop();
a[t.se] = i;
}
for(int i = 1;i <= n;i ++ )
{
cout << a[i] << ' ';
res[i].clear();
}
cout << endl;
}
signed main()
{
ios;int T; cin >> T;
while(T -- ) solve();
return 0;
}
最后
以上就是时尚小蜜蜂为你收集整理的Educational Codeforces Round 131 (Rated for Div. 2)一、A - Grass Field二、B - Permutation三、C - Schedule Management四、补:D - Permutation Restoration的全部内容,希望文章能够帮你解决Educational Codeforces Round 131 (Rated for Div. 2)一、A - Grass Field二、B - Permutation三、C - Schedule Management四、补:D - Permutation Restoration所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复