zoukankan      html  css  js  c++  java
  • Gym 100703K Word order 贪心

    题目链接

    题意:给定一个长度为n的字符串,字符串仅由"F","N","A"三种字符组成,现有一种操作P,即把两个相邻的字符调换位置。要求把所有的A都放在所有的F左侧,问需要的最少操作P的次数。

    题解:首先从左至右的扫描原串,对于每一个"A",设它的左侧有x个"F",则必然至少需要x次操作将"A"换到"F"的左侧或者把“F”换到"A"的右侧。然后对于每个"N",设它左侧有L_F个"F",右侧有R_A个"A",若L_F大于R_A,则更优解就是把"A"换到左侧,而反之,则是把"F"换到右侧,即把"N"移动到边上去的最小步数,不要干扰移动。如果说不考虑"N"只移动"A"和"F",其实得出结果都是一样的,"N"是一定要耗费步数的。例如现在有x个N左面3个F,右面5个A;如果没有N那么需要移动的步数是3*5=5*3=15,现在有N,那么移动到步数就是3*(5+x)或者5*(3+x),很显然前者值小于后者,所以我们移动数量较小的那一方。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=123;
    char c[maxn];
    int main()
    {
        int n;
        scanf("%d%s",&n,c);
        int sum=0,lf=0,ra=0;
        for(int i=0;i<n;i++)
        {
            if(c[i]=='F') lf++;
            else if(c[i]=='A') sum+=lf;
        }
        for(int i=n-1;i>=0;i--)
        {
            if(c[i]=='F')
            lf--;
            else if(c[i]=='A')
            ra++;
            else
            sum+=min(lf,ra);
        }
        printf("%d
    ",sum);
        return 0;
    }
  • 相关阅读:
    jeecg中树形显示的用法
    jeecg中ajax传值的前端js和后台代码
    js中去掉字符串中的某个指定字符
    Address already in use: JVM_Bind(端口冲突)
    jeecg中List页面标签的用法
    HTML map标签图片区域链接
    CSS块级元素和行内元素
    discuz 标签
    JavaScript中getYear()各个浏览器的差异
    [HNOI2017] 礼物
  • 原文地址:https://www.cnblogs.com/Ritchie/p/5928024.html
Copyright © 2011-2022 走看看