洛谷2524 Uim的情人节礼物·其之弐解题报告

这篇博客详细介绍了洛谷2524题目的解题思路,该题目要求找到给定N个妹子送礼物的字典序最小的第几个排列。博主分享了自己因忽视输入格式导致的WA错误,并提出解决方案是使用字符串读入,通过康托展开的方法解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说一下,这道题思路明显。

洛谷2524 Uim的情人节礼物·其之弐
本题地址: http://www.luogu.org/problem/show?pid=2524
题目描述
前传:详见洛谷P2525 //为什么前传在后传的后面?
Uim成功地按照顺序将礼物送到了N个妹子的手里并维持她们的和谐。
Uim现在想知道,他最终选择的顺序是所有给N个妹子送礼顺序中、字典序第几小的。
输入输出格式
输入格式:
第一行一个整数N,表示有N个数。
第二行一个整数X,表示给出的排列。
输出格式:
一个整数,表示是第几小的字典序。
输入输出样例
输入样例#1:
3
231
输出样例#1:
4
说明
1<=N<=9
输入的排列没有空格

但是,当初提了好几遍都是WA因为后面有这么几句没有空格!!!
好吧,其实没有空格也是很容易解决的——只要用字符串读入。。。然后存。。。其实就是康托展开。。。题目说的很明显,就是字典序。。。
我得说当初学的时间没有认真学。。。。还得去研究一下
代码如下

#include<iostream>  
#include<cmath>  
#define ff(i,s) for(int i=s;i<n;i++)  //宏,,,据说可以压缩代码,但我没看出。。。
using namespace std;  
int n,number=1,z=1,tot=1,a[10],t;  
int main()  
{  
    cin>>n;           //其实完全没必要有n,只需要用strlen()函数就行了。。。还有表在意用ch来表示字符串
    char ch[10];  
    cin>>ch;  
    ff(i,0)a[i]=ch[i]-48;   //数字=机内存储数-48或-‘0’
    for(int i=n-2;i>=0;i--)     //好,下面就是康托展开。其实就是一位一位的计算。和就是字典序
    {  
        number=number*(z++);           
        t=0;  
        for(int j=i+1;j<n;j++)  
        {  
            if(a[j]<a[i])  
            t++;  
        }  
        tot+=t*number;             
    }  
    cout<<tot;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值