38. Count and says 38. 报数

思路:
每次,针对上一次的字符串,找到第一处不同的地方,记录次数和当前值,然后加入string builder,
class Solution {
    public String countAndSay(int n) {
        int count=1;
        StringBuilder result = new StringBuilder();
        String cur="1";
        while(n>1){         
            for(int i=0;i<cur.length();i++){
            	
            	while(i<cur.length()-1&&cur.charAt(i)==cur.charAt(i+1)){
            		count++;
            		i++;
            	}
               	result.append(count);
            	result.append(cur.charAt(i));  
            	count=1;
            }
            cur=result.toString();
            result.delete(0,result.length());
            n--;       
        }     
        return cur;
    }     
}

# T666199 彻彻崩 ## 题目背景 滚木,KAS 彻底怒了。KAS 指出了最核心的矛盾点:如果 $l_1\ge l_2$,$l_2>l_3$,那么为什么会有 $l_1>l_3$?这确实是 KAS 的严重错误。我需要彻底承认 KAS 的话是在滚木,重新建立逻辑。 > A:不是今年 $20$ 分就能进 NOIP 吗?为什么你没进? > > K:不是,我(CSP-S1)报都没报名怎么进? ## 题目描述 **这是一道交互题**。 大 K 梦到了一个长度为 $n$ 的排列 $a_1,a_2,\cdots ,a_n$,但他只会给你 $n$ 的值。你需要通过以下询问知道他的 $a$,以让他彻底暴怒: - $\texttt ?\ k\ x_1\ y_1\ x_2\ y_2\cdots x_k\ y_k$:给出一组 $k$ 个条件 $a_{x_i}=y_i$,大 K 的怒气值变为他的排列和你给出的条件信息相符的数量,评测机会给出他的怒气值。你需要保证 $k,x_i,y_i$ 均为正整数,且 $1\le k\le \bold{20n},1\le x_i,y_i\le n$。请注意你无需保证 $(x_i,y_i)$ 互不相同。 你需要在 $n$ 次询问内给出大 K 梦到的 $a$。**输出 $a$ 的操作不包含在询问次数内**。 ## 输入格式 见【交互方式】。 ## 输出格式 见【交互方式】。 ### 交互方式 首先评测机会给出一个整数 $n$,代表 $a$ 的长度。 接着你可以进行询问,对于每次询问输出一行,格式为 $\texttt ?\ k\ x_1\ y_1\ x_2\ y_2\cdots x_k\ y_k$,并换行。 在每次询问后,评测机会给你一个整数 $z$,代表大 K 的怒气值。**输出格式错误等行为将会使 $z=-1$,在这种情况下请立即结束程序**,否则你的程序会因为从已关闭的流中读取信息导致获得不确定的结果。 当你要给出 $a$ 时,请输出一行 $\texttt !\ a_1\ a_2\cdots \ a_n$。在输出后请**立即结束程序**。 在每一行输出后,请**清空缓冲区**。具体地,对于 C/C++ 语言,可以通过 `fflush(stdout)` 进行清空;对于其他语言,请自行查阅对应语言的文档。 交互器不是适应性的,在评测开始前 $a$ 就已经被确定。 ## 输入输出样例 #1 ### 输入 #1 ``` 4 0 1 2 0 ``` ### 输出 #1 ``` ? 3 1 3 2 2 3 1 ? 1 1 1 ? 3 2 3 2 4 3 3 ? 1 4 4 ! 1 4 3 2 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 1 ``` ### 输出 #2 ``` ! 1 ``` ## 说明/提示 样例解释中的示例仅为交互方式示例。 ### 样例解释 $1$ 该样例中的 $a=\{1,4,3,2\}$。每个操作解释如下: 1. 询问一组 $3$ 个条件 $a_1=3,a_2=2,a_3=1$:都和 $a$ 不符,怒气值为 $0$; 2. 询问一组 $1$ 个条件 $a_1=1$:与 $a$ 相符,怒气值为 $1$; 3. 询问一组 $3$ 个条件 $a_2=3,a_2=4,a_3=3$:$a_2=4,a_3=3$ 与 $a$ 相符,怒气值为 $2$; 4. 询问一组 $1$ 个条件 $a_4=4$:和 $a$ 不符,怒气值为 $0$。 5. 向评测机给出 $a$。询问次数在 $4$ 次以内,视为答案正确,获得满分。 ### 数据范围 **本题开启捆绑测试。你在一个子任务上的得分为其所有测试点得分的最小值。** 对于全部数据,$1\le n\le 400$。 |子任务编号|$n\le $|分值| |:---:|:-----:|:---:| |$1$ |$40$|$25$| |$2$ |$400$|$75$| ### 计分方式 首先,若输出格式错误或猜测的排列错误,你在该测试点上获得 $0$ 分。 否则,如果你使用了 $q$ 次询问猜出了排列,计分方式如下: - 如果 $q\le n$,你获得满分; - 如果 $q>10n$,你获得 $0$ 分; - 否则,你获得的分数为: $$ score=90e^{1.5(1-\frac{q}{n})} + 10 $$ 具体地,你的得分与 $q$ 呈负相关。当 $\dfrac{q}{n}$ 为以下值时,对应的得分如下图所示: ![](https://cdn.luogu.com.cn/upload/image_hosting/3glbojjs.png)C++代码
最新发布
12-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值