首页 > 其他分享 >solution-p1532

solution-p1532

时间:2024-03-06 17:03:25浏览次数:29  
标签:p1532 int solution long ++ flag 循环 len

题解 P1532 【卡布列克圆舞曲 】

原题

一道较难搞的模拟

因为蒟蒻不会奇奇怪怪的STL

所以都是手打的

思路

一个数组b存储操作过程中的数

每次扫一遍判断是否开始循环

如果循环:

记录循环开始的位置k

从k开始到总操作次数len - 1(第len个循环了)输出b[i]

否则:

len++,记录当前数用于下一次判断循环。

代码

// 此处应有头文件
int a[105]; // 将数倒入数组方便处理 
long long b[100005]; // 存储过程
bool cmp(int a,int b)
{
    return a > b;
}
long long max_(long long n)
{
    memset( a , 0 , sizeof(a) );
    a[0] = 1; // a[0] 存储位数 
    while(n) // 将数转换为数组 
    {
        a[ a[0] ] = n % 10;
        n /= 10;
        a[0]++;
    }
    a[0]--;
    sort(a + 1 , a + a[0] + 1 , cmp); // 从大到小排序 
    long long k = a[1];
    for(int j = 2;j <= a[0];j++)
        k = k * 10 + a[j];
    return k;
}
long long min_()
{
	// max_ 函数已经将a数组从大到小排序
	// min_ 函数反过来算即可 
    long long k = a[ a[0] ];
    for(int j = a[0] - 1;j >= 1;j--)
        k = k * 10 + a[j];
    return k;
}
int main()
{
    long long n;
    while(cin >> n)
    {
        int len = 0; // 总操作次数
        int k; // 循环节起点
        bool flag = true; 
        b[len++] = n;
        while(flag)
        {
            b[len] = max_(b[len - 1]) - min_();
            
            // max_ : n重新排列后最大
            // min_ : -----------最小 
			
            n = b[len]; // 用于判断循环 
            for(int i = 0;i < len;i++)
            {
                if(b[i] == n) // 是否循环
                {
                    flag = false;
                    k = i;
                    break ;
                }
            }
			len++;
        }
        for(int i = k;i < len - 1;i++) // 从循环起点 k 到 len - 1
            cout << b[i] << " ";
        cout << endl;
    }
    return 0;
}

标签:p1532,int,solution,long,++,flag,循环,len
From: https://www.cnblogs.com/iorit/p/18056993

相关文章

  • solution-cf877d
    题解CF877D【OlyaandEnergyDrinks】原题一道几乎板子的广搜题。(然而我调了10几次才过我们只需要在广搜板子的基础上添加移动$1-k$步的部分即可就像这样:inth[]={-1,1,0,0};intl[]={0,0,-1,1};for(inti=0;i<4;i++){ for(intj=1;j<=k;j......
  • solution-cf236b
    题解CF236B【EasyNumberChallenge】原题此题一个暴力就可以过了。看着别的大佬不加记忆化吸口氧就过了,而我的却死活TLE可能因为我人丑常数大?注意到i*j*k的值会出现重复,所以考虑记忆化。时间复杂度\(O(n^3\sqrtn)\),跑得飞快代码constintN=1e6+10,M=1073741824......
  • solution-cf120e
    题解CF120E【PutKnight!】原题我一开始以为这题\(n\)为奇数就是先手赢,偶数就是后手赢没想到还真是这样那么要怎么证明呢?一般地,在一个空棋盘上下出一枚棋,会有8个格子被这颗棋限制:XXXXKXXXX容易看......
  • solution-at4703
    题解AT4703【RedorBlue】原题来介绍一下三元运算符:A?B:C如果表达式A为真,则执行B语句,否则执行C语句。其作用就相当于:if(A){ B;}else{ C;}例如1+1>2?puts("IAKIOI"):puts("qwq");将会输出qwq。那么此题代码就可以变得极简。代码#include<iostr......
  • solution-at945
    题解AT945【高橋君とお肉】原题来一篇正经的题解QwQ显然我们要把肉分成耗费时间尽量平均的两堆。于是考虑二分答案那么怎么检测一个答案的正确性呢?我们可以跑一个背包dp,让第一个烤肉架烤尽可能多的肉,最后检测第二个烤肉架能不能烤完剩下的肉即可。时间复杂度\(O(nlog^2n)......
  • p7915-solution
    P7915Solutionlink考虑枚举第一个操作选L还是R。这样原序列就被分为了两个栈,用四个指针\(p1,p2,p3,p4\)分别指向这两个栈的栈顶栈底。感性理解一下,某一个栈的栈顶\(x\)可以被pop当且仅当某一个栈的栈底等于\(x\)。于是直接dfs,每次优先选L,同时确定第\(2n-i+1\)......
  • p7914-solution
    P7914Solutionlink先考虑Subtask\(4\)。设\(dp_i\)表示长度为\(i\)的方案数,按题目定义转移:AB,ASB:\(\displaystyledp_n\getsdp_n+\sum_{i=1}^{n-1}\sum_{j=0}^kdp_i\timesdp_{n-i-j}\)(A):\(\displaystyledp_n\getsdp_n+dp_{n-2}\)(SA),(AS):\(\displa......
  • p7913-solution
    P7913Solutionlink先考虑有\(n\)个廊桥的分配。假设廊桥编号为\(1\simn\),我们用两个堆\(h1,h2\)分别存当前空闲的廊桥编号和正在使用廊桥的飞机的离开时间。对于国内和国外的飞机分别做一次以下操作:先按到达时间排序,从左到右扫,到第\(i\)架飞机的到达、离开时间为\(l_......
  • p5384-solution
    P5384Solutionlink弱化这题空间\(\mathcalO(n\logn)\)会MLE。考虑怎么搞到\(\mathcalO(n)\)。首先求k级祖先用树剖空间是\(\mathcalO(n)\)的。然后看看我们建线段树的过程,我们发现每次查询都是在对应深度的线段树里查,那么考虑把询问离线,把节点、询问对应到深度......
  • p4845-solution
    P4845Solutionlink考虑树形dp,对于每个\(u\)直接钦定它的三种可能状态:有灯,没灯但是被其他灯照亮,没灯也没被照亮。这样钦定会导致一些需要被照亮的点在当前子树中还未被照亮,需要依靠子树外的灯来照亮。称这种点为闲置点。状态内只需要记录闲置点中最深的到子树根的距离,以及......