已解决
Codeforces Round 889 (Div. 2)A~C1题解
来自网友在路上 149849提问 提问时间:2023-09-28 02:53:44阅读次数: 49
最佳答案 问答题库498位专家为你答疑解惑
A. Dalton the Teacher
题目分析:
模拟,写出两个就能找出规律:坐在自己位子上的小孩会不高兴,所以统计下来cnt
发现cnt为奇数是(cnt+1)/2次就能换成要求,偶数就是cnt/2
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#define INF 0x3f3f3f3f
#define endl "\n"
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
typedef long long ll;
using namespace std;
const int N =2e5+7;
int main(){IOSint t;cin>>t;while(t--){ll cnt=0;int n;cin>>n;int x;for(int i=1;i<=n;i++){cin>>x;if(x==i)cnt++;}if(cnt%2){cout<<(cnt+1)/2<<endl;}else cout<<cnt/2<<endl;}return 0;
}
B. Longest Divisors Interval
题目分析:给你一个1e18大小的数n,让你 找出最长的连续数列满足这个数列每个都是n的除数
1e18为long long 类型,假设=1,
=26,long long 就会爆掉,所以,连续序列的长度最多不超过25,同理,越往后面,数字越大,也即只需要在1~25范围内找连续数列就行
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#define INF 0x3f3f3f3f
#define endl "\n"
#define IOS ios::sync_with_stdio(false);cin.tie(0);
typedef long long ll;
using namespace std;
const int N =2e5+7;
int a[N];
struct ss {int a,b;
}stu[N];
int main(){IOSint t;cin>>t;while(t--){ll n;cin>>n;ll ans=0;for(int i=1;i<=25;i++){ll tmp=0;while(n%i==0){i++;tmp++;}ans=max(ans,tmp);}cout<<ans<<endl;}return 0;
}
C1. Dual (Easy Version)
题目分析:每次将 j 加到
i上,最终在不超过50次的操作下,使得整个序列变为不递减序列
特殊情况:全正 or 全负 两种情况处理起来差不多,后加前 or 前加后 最多 19次操作
其余情况不好处理,考虑往特殊情况上转,也即找到最大的数和最小的数相加,若小于零,则将最小的数加上全序列变为全负,否则变为全正,最多19次操作
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#define INF 0x3f3f3f3f
#define endl "\n"
#define IOS ios::sync_with_stdio(false);cin.tie(0);
typedef long long ll;
using namespace std;
typedef pair<int ,int >pii;
const int N =2e5+7;
int a[N];
struct ss {int a,b;
}stu[N];
vector<pii>ans;
int main(){IOSint t;cin>>t;while(t--){int n;cin>>n;cin>>a[1];int mas=a[1];int mins=a[1];int masidx=1;int minsidx=1;for(int i=2;i<=n;i++){cin>>a[i];if(a[i]>mas){mas=a[i];masidx=i;}if(a[i]<mins){mins=a[i];minsidx=i;}}if(mins+mas<0){for(int i=1;i<=n;i++){if(i!=minsidx){ans.push_back({i,minsidx});}}for(int i=n-1;i>=1;i--){ans.push_back({i,i+1});}}else {for(int i=1;i<=n;i++){if(i!=masidx){ans.push_back({i,masidx});}}for(int i=2;i<=n;i++){ans.push_back({i,i-1});}}cout<<n*2-2<<endl;for(auto x:ans){cout<<x.first<<" "<<x.second<<endl;ans.pop_back();}}return 0;
}
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Codeforces Round 889 (Div. 2)A~C1题解":http://eshow365.cn/6-14978-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!