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(){IOS
int 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(){IOS
int 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(){IOS
int 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;
}