2018级算法第三次期末-神秘谜语

作为xxnn晚会的宣传题,请ZH安排一下宣传费用

题目描述

心心廿廿晚会就要开始啦,作为软件学院光辉美丽的化身,春天与喜悦之神,光的拟人化,过去一切沉沦与虚伪的终结者,未来美好与正义的开启者--Alvin辉(朱辉上仙) 他有着旋转乾坤的能力,在晚会的抽奖栏目上,他轻敲响指就可以抽中所有的奖品,有一天他找到了某楠,说出了一个谜语,如果猜对了的话就能把大奖抱回家(不存在的)。

谜语是这样的:

有一连串无序的小写字母,某楠需要交换序列中相邻的两个元素。使得原序列变成不上升序列的最少的交换次数,就是谜底了。

输入

多组数据。

第一行为一个整数$n$,表示序列长度($0<n\le10^6$)

第二行为$n$个字母,表示序列中每个元素。

输出

对于每组数据,输出一行,为谜底,结果对1000000007取模

输入样例

4
a d c e
4
a a a a

输出样例

5
0

题目考点

归并排序呀  以前做过类似的鸭

为什么大家不会读入鸭

#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
const int maxn=1000005;
//下面就是 归并排序求逆序对 的过程
char a[maxn],r[maxn];
int n;
ll ans=0;//ans作为全局变量,记录逆序对的数量;
void msort(int s,int t)
{
    if(s==t)
        return ;
    int mid=(s+t)>>1;
    msort(s,mid),msort(mid+1,t);//→→→→→→→递归的体现
    //在这插入
    int i=s,j=mid+1,k=s;
    while(i<=mid&&j<=t)
        if(a[i]>=a[j])
            r[k++]=a[i++];//先赋值再+1
        else
            r[k++]=a[j++],ans=((ll)mid-i+1+1000000007+ans)%1000000007;//可以理解为上面的数学归纳吧qaq;最重要的部分
    while(i<=mid)
        r[k]=a[i],k++,i++;
    while(j<=t)
        r[k]=a[j],k++,j++;
    for(int i=s; i<=t; i++)
        a[i]=r[i];//复制回a数组中
}

int main()
{
    while(cin>>n)
    {
        ans = 0;
        for(int i=1; i<=n; i++)
            cin>>a[i];
        msort(1,n);//从1到n将a数组排序;
        cout<<ans<<endl;
    }
    return 0;
}

还有一种读入方法

scanf("%c",&ch); if(ch<=‘z‘&&ch>=‘a‘)   a[i++]=ch;

还有一种读入方法

scanf("%s",ss);
a[i]=ss[0];    

怎么就不会读入呢???

原文地址:https://www.cnblogs.com/kubab119/p/12128331.html

时间: 2024-11-13 18:29:32

2018级算法第三次期末-神秘谜语的相关文章

题解:2018级算法第三次上机 C3-Zexal的浩瀚星辰

题目描述: 样例: 实现解释: 一道结合了火箭发射的贪心题目 知识点: 贪心,优先队列 题目分析: 根据题目描述可知,延迟后时间是正常推进的,也就是假设共有n个火箭,推迟k小时.则在到达k+1小时时,每过一个小时只要火箭没发射完都会有k(如果k大于n就是有剩余数量)个火箭会遭受延迟的损失,显然这是必然的(因为到达k小时前的损失都已经确定了,无法改变). 那么依据题意只要使得每次这k个火箭的损失最小即可,而如何最小:让其中单位时间损失最大的火箭发射即可,这样一定比发射其他火箭的损失要小. 于是便可

2016级算法第三次上机-G.Winter is coming

904 Winter is coming 思路 难题.首先简化问题, \(n\) 个0与 \(m\) 个1排成一列,连续的0不能超过x个,连续的1不能超过y个,求排列方法数. 显然会想到这是动态规划.最快想到的方法是 \(dp[i][j][x][y]\) 表示已经有i个北境兵j个野人参与排列,且末尾有x个连续北境士兵或y个连续野人士兵的方案数.这方法显然是正确的,但是光是 \(dp[200][200][10][10]\) 数组已经十分接近本题内存限制了,保证MLE.状态转移方法是大模拟,四层fo

2016级算法第三次上机-B.Bamboo和巧克力工厂

B Bamboo和巧克力工厂 分析 三条流水线的问题,依然是动态规划,但是涉及的切换种类比较多.比较易于拓展到n条流水线的方式是三层循环,外层是第k个机器手,里面两层代表可切换的流水线 核心dp语句:cost[i][k] = min(cost[i][k], cost[j][k-1]+t[j][i]+p[i][k]) 也可以在A题的基础上详细的列出所有可能的路线切割情况然后找到最小值. 注意本题与A题中t的含义不同. 上机时给出的伪代码 //数组从0开始 const int maxx= 510;

2016级算法第三次上机-C.AlvinZH的奇幻猜想——三次方

905 AlvinZH的奇幻猜想--三次方 思路 中等题.题意简单,题目说得简单,把一个数分成多个立方数的和,问最小立方数个数. 脑子转得快的马上想到贪心,从最近的三次方数往下减,反正有1^3在最后撑着保证减完.不好意思这是错的,因为1,27,64,125...等立方数之间并不是倍数关系,不能构成贪心策略.举个反例:96=64+8+8+8+8=64+27+1+1+1+1+1,答案明显是5,而贪心会算到7. 既然不是贪心,那就是DP了,没毛病.先讲一下常规做法吧,是这样想的:相当于把一个数化成几份

题解:2018级算法第四次上机 C4-最小乘法

题目描述: 样例: 实现解释: 和字符串处理结合的动态规划,个人认为比较难分析出状态转移方程,虽然懂了之后挺好理解的 知识点: 动态规划,字符串转数字 题目分析: 首先按照最基础:依据题意设计原始dp数组,这里根据描可知有三个数需要考虑:数字串开始,数字串结尾和之间插入的乘号数量,因此基础dp[i][j][k],分别为开始,结束脚标和乘号数. 然后推导:考虑到添加乘号,为了使状态转移方程简单,最后固定位置,因此可以考虑每次都在最后插入乘号,插入乘号的位置便可倒序确定.此时数字串的开始位置便可固定

2016级算法第三次上机-F.ModricWang的导弹防御系统

936 ModricWang的导弹防御系统 思路 题意即为:给出一个长度为n的序列,求出其最长不降子序列. 考虑比较平凡的DP做法: 令\(nums[i]\) 表示这个序列,\(f[x]\) 表示以第\(x\)个数为结尾的最长的不降子序列的长度,状态转移方程为: \[ f[i]=(\max{f[j]}+1) \;\;\;\;\;\;\; \mbox{when $nums[i]<=nums[j]$}\\] f中的最大值即为答案. 时间复杂度\(O(n^2)\),空间复杂度\(O(n)\) 当然也可

2017级算法第三次上机-B.SkyLee逛漫展

ALS 一道动态规划最经典的题目 动态规划实质上其实就是表格法,利用表格来记录每个子问题的解. DP所关注的其实是递归 即一个较小问题的解和一个较大问题的状态转移问题. 其次还要关注的其实还是是初始值的设立,这个决定了后续的递推能否顺利的进行. 还有要思考好dp数组所代表的具体的含义 这样在状态转移的过程中 也可以好一点理解. #include <iostream> #include <algorithm> #include <cstring> using namesp

题解:2018级算法第二次上机 Zexal的钢管切割

题目描述: 样例: 实现解释: 经典钢管切割问题的变形:最赔钱切割 知识点:动态规划,钢管切割 实现方法即得出状态转移方程后完善为代码即可,先设数组price[i]存储着i长度钢管切割后的最小值,p[i]存储着i长度钢管不切割的值,price数组既是本问题的dp数组. 经过分析可知状态转移方程为: price[0] = 0; price[i] = min(p[1]+price[i-1],p[2]+price[i-2],...p[i-1]+price[1],p[i]); 因为price[i]已经是

题解:2018级算法第二次上机 Zexal的排座位

题目描述: 样例: 实现解释: 一道看似复杂但实际既是斐波那契变形的题目 知识点:递推,斐波那契 通过问题的描述,可以得到以下规律:(除了座位数为一时)男生坐最后时,倒数第二个一定是女生:女生坐最后,倒数第二个均可.转化:i个位置时男生结尾的情况数等于i-1个位置时女生结尾的情况数,i个位置时女生结尾的情况数等于i-1个位置时的总情况数. 于是便可得出两种解决方案:斐波那契变形和直接循环递推 斐波那契变形: i位置男生结尾的情况 = i-1位置女生结尾情况数 = i-2位置总情况数 i位置女生结