首页 > 其他分享 >CSP历年复赛题-P1061 [NOIP2006 普及组] Jam 的计数法

CSP历年复赛题-P1061 [NOIP2006 普及组] Jam 的计数法

时间:2024-05-24 16:30:48浏览次数:26  
标签:NOIP2006 int 字母 计数法 start Jam str 升序 P1061

原题链接:https://www.luogu.com.cn/problem/P1061

题意解读:从编号s~t的字母从挑w个,组成一种特殊的数字,数字里字母都是升序的,给定初始数字,要计算后5个。

解题思路:

1、模拟法

模拟样例:

2 10 5

有效字母范围:b,c,d,e,f,g,h,i,j 

初始值:b d f i j

要计算b d f i j的下一个,采取如下步骤:

1、从右边数,先看第一位j,有效字母中是否有一个大于j的,如果有则用第一个大于j的进行替换,显然没有

2、从右边数,再看第二位i,有效字母中是否有两个大于i的,依然没有

3、从右边数,看第三位f,有效字母中有g,h,i,j都大于f,取前三个f开始的三个进行替换,变成b d g i j

同理,再计算b d g i j的下一个即可。

100分代码:

#include <bits/stdc++.h>
using namespace std;

int s, t, w;
string str;

int main()
{
    cin >> s >> t >> w >> str;

    int cnt = 0;
    while(true)
    {
        bool yes = false;
        for(int i = 1; i <= w; i++) //从右边第1个开始,一直到第w个
        {
            int x = str.size() - i; //右边第i个的下标
            if(t - (str[x] - 'a' + 1) >= i) //计算是否有超过i个比右边第i个大的字母
            {
                //有的话用前i个替换str[x]到最后
                char tmp = str[x];
                for(int j = 1; j <= i; j++)
                {
                    str[x + j - 1] = tmp + j;
                }
                cnt++;
                yes = true;
                cout << str << endl;
                break;
            }
        }
        if(!yes || cnt == 5) break;
    }

    return 0;
}

2、DFS

类似于火星人的全排列,需要从指定排列开始,填w个空

不同的是,需要保证字母都是升序的,即开始枚举的字母必须比前一位的字母大1

另外,由于字母是升序的,天然保证了不会有重复,因此不需要标记数据

100分代码:

#include <bits/stdc++.h>
using namespace std;

int s, t, w;
string str;
int line[30]; //排列
int cnt;
bool start = false;

void dfs(int k)
{   
    if(k == w)
    {
        if(!start) start = true;
        else
        {
            for(int i = 0; i < w; i++) cout << char(line[i] - 1 + 'a');
            cout << endl;
            if(++cnt == 5) exit(0);
        }
        return;
    }
    int begin = s;
    if(k > 0) begin = line[k-1] + 1; //从上一个字母的后一个开始
    for(int i = begin; i <= t; i++)
    {
        if(!start)
        {
            i = str[k] - 'a' + 1;
        }
        line[k] = i;
        dfs(k + 1);
    }
}

int main()
{
    cin >> s >> t >> w >> str;
    dfs(0);

    return 0;
}

 

标签:NOIP2006,int,字母,计数法,start,Jam,str,升序,P1061
From: https://www.cnblogs.com/jcwy/p/18211212

相关文章

  • 洛谷题单指南-动态规划3-P1063 [NOIP2006 提高组] 能量项链
    原题链接:https://www.luogu.com.cn/problem/P1063题意解读:本质上是一个环形石子合并问题,计算合并产生的最大能量。解题思路:对于环形DP问题,可以把环拆开,并复制2倍长度,然后用1~n的区间长度去枚举1、状态表示设structnode{inthead,tail}用于表示每一个项链节点,其中有头、尾......
  • R语言中如何将科学计数法转换为数值型
     001、测试a<-c("1.23e-2","7.56207e-05","6.86470e-05")as.numeric(a)##直接转换为数值类型,然而并不起作用 02、增加参数options(scipen=100)##小数点后100位不适用科学计数法b<-c("1.23e-2","7.56207e-05","......
  • 洛谷题单指南-动态规划1-P1064 [NOIP2006 提高组] 金明的预算方案
    原题链接:https://www.luogu.com.cn/problem/P1064题意解读:用固定钱数购买最大价值的物品。解题思路:背包问题,背包问题里的体积相当于物品价格,价值相当于价格*重要度物品分为主件、附件,主件最多有0/1/2个附件,要选附件必须选相应主件,因此在递推计算dp[j]总价格j能购买的最大价......
  • Java BigDecimal出现科学计数法
    JavaBigDecimal出现科学计数法查看BigDecimal的toString()源码,可以发现出现toString()出现科学计数法的原因 privateStringlayoutChars(booleansci){...intcoeffLen=coeff.length-offset;longadjusted=-(long)scale+(coeffLen-1);......
  • CF1361E James and the Chase 题解
    Description给定一个有\(n\)个点\(m\)条边的有向强连通图。称一个点是好的当且仅当它到其他点都有且只有一条简单路径。如果好的点至少有\(20\%\)则输出所有好的点,否则输出-1。单个测试点内有多组数据。\(1\leqT\leq2\times10^3,1\leqn\leq10^5,1\leqm\leq2\time......
  • P1064 [NOIP2006 提高组] 金明的预算方案
    原题链接题解遍历主件,和还剩下多少钱的情况下,最多有五种购买决策1.不买2.买主件3.买主件+附件14.买主件+附件25.买主件+附件1+附件2如果当前的钱够买,那就买买看,然后加上剩下的钱能买的最大值code#include<bits/stdc++.h>usingnamespacestd;structunit{intv,......
  • CF916E Jamie and Tree 题解
    题目链接:CF或者洛谷本题难点在于换根LCA与换根以后的子树范围寻找,重点讲解先说操作一,假如原根为\(1\)变为了\(x\),又变为了\(y\),那么其实\(y\)和\(x\)都可以看做由\(1\)变化而来的,即\(1\rightarrowx\)与\(1\rightarrowy\),原因很简单,我们可以把\(1\rightar......
  • https://repo.radeon.com/rocm/apt/6.0.2 jammy/main amd64 下载太慢
    获取:1https://repo.radeon.com/rocm/apt/6.0.2jammy/mainamd64comgramd642.6.0.60002-115~22.04[51.7MB]获取:2https://repo.radeon.com/rocm/apt/6.0.2jammy/mainamd64composablekernel-devamd641.1.0.60002-115~22.04[109MB]获取:3https://repo.radeon.com/ro......
  • P1059 [NOIP2006 普及组] 明明的随机数
    1.题目介绍[NOIP2006普及组]明明的随机数题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了\(N\)个\(1\)到\(1000\)之间的随机整数\((N\leq100)\),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学......
  • C#double类型转换成科学计数法类型(全网最全最好回答)
     doubledoubleData=heatData.MaxSampleValue.ToString("0.0000E+0"); 众所周知G7的转换是有精度限制的,所以:doublevalue1=1234.56789;doublevalue2=0.000123456789;doublevalue3=12345678901234567890.123456789;stringf......