C. Sequence Transformation

探讨了如何在给定序列中找到字典序最大的排列,通过去除元素并计算剩余元素的最大公约数(GCD)。算法首先移除所有奇数,然后处理偶数,确保最终排列的GCD特性,特别关注三元素特殊情况。

链接

[http://codeforces.com/contest/1059/problem/C]

题意

给你一个n,有个序列有n个元素分别时1 ~ n,每次去掉一个元素输出剩下元素的GCD,使得最后的排列字典序最大

分析

显然第一个是1,有一点就是相邻的奇偶数必互质gcd==1,所有第二部就是一个接一个地去掉所有的奇数,
后面就剩下12,22....x2<=n,同理相邻的偶数gcd必是2,相差4的偶数gcd必是4,以此类推
但有个情况就是剩下3个数的时候,比如x,2
x,3x,怎么删除某个数都不能使gcd为2x,这时最大的字典序只能是x,x,3*x;
看代码就知道了

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,base,i;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
        base=1;
        while(n){
            if(n==3)
            {
                cout<<base<<' '<<base<<' '<<3*base<<endl;
                break;
             } 
             for(i=1;i<=n/2+n%2;i++) cout<<base<<' ';
             n/=2;
             base*=2; 
                    }
    return 0;
}

转载于:https://www.cnblogs.com/mch5201314/p/9747450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值