A - Max Mod Min
Problem Statement
就是每一次选择序列的最大值和序列的最小值, 然后把最大值
求需要几次这种操作, 使得给定序列的元素个数为一.
Editorial
算法1
暴力模拟
算法2
分析问题的单调性, 因为最大值在经过一次操作之后一定严格小于其自身的
所以, 根据单调性, 可以用一个双端队列来实现操作, 先对序列进行排序, 在进行模拟, 该做法复杂度有保证.
总复杂度为
Code
signed main(){
fastio();
int n;
cin>>n;
F(i, 0, n) cin>>a[i];
sort(a, a + n);
deque<int> q;
F(i, 0, n) q.push_back(a[i]);
int ans = 0;
while(q.size()>1){
int t = q.front(), e = q.back();
q.pop_back();
int tmp = e % t;
if(tmp != 0) {
q.push_front(tmp);
}
++ ans ;
}
cout<<ans<<endl;
return 0;
}
B - Swap to Sort
Problem Statement
给定一个排列, 有两种操作:
操作 A: 交换
和 . 操作 B: 交换
和 .
求一个操作序列, 使得
- 操作 A 的个数尽可能少.
- 最后序列为单调递增
- 总操作数不超过
Editorial
考虑构造一种操作策略, 使得其满足要求
最小化操作 A 的的个数
首先, 由于交换间隔为
定义:
- 如果
和 奇偶性相同, 则称 为好下标, 反之则为坏下标, 序列的坏下标总数记作序列的不和谐度.
操作 A 中, 序列的不和谐值变化
操作 B 中, 序列的不和谐值不发生变化.
所以操作 A 至少要被使用
使不和谐值为 0
可以发现, 要使操作 A 的个数最少, 必须要在
排序
由于不和谐值已经为
分析总操作数
要使坏下标聚集在一起, 最多要使用
操作 A 最多使用
排序最多使用
所以当
Code
//////////////////// Global Variables ////////////////////
constexpr int N = 500;
int n,m,i,j,a[405];
vector<pair<char,int> > v;
/////////////////////// Functions ////////////////////////
void opt(int x,int l)
{
swap(a[x],a[x+l]);
v.push_back(make_pair(l==1?'A':'B',x));
}
////////////////////// Main Execution ////////////////////
signed main(){
fastio();
cin>>n;
Fe(i, 1, n) cin>>a[i];
Fe(i, 1, n){
if((i&1)!=(a[i]&1)){
int j=i+1;
while((j&1)==(a[j]&1)) j+=2;
while(j>i+1) opt(j-=2,2);
opt(i,1);
}
}
Fe(i, 1, n){
Fe(j, 1, n-2){
if(a[j]>a[j+2]) opt(j,2);
}
}
cout<<(int)v.size()<<endl;
fitr(v,it){
cout<<it->fi<<' '<<it->se<<endl;
}
return 0;
}
C - Min Diff Sum
Problem Statement
We define the dissatisfaction level as the following formula:
Find the minimum possible value of the dissatisfaction level.