[思路题+贪心] fzu oj 2197 最小花费

题意:

给一个01串,相邻的01交换代价为X,否则为Y。

问把全部1变到0前面的最小费用。

思路:

对于 01011->11100

如果只靠相邻位移动是需要5步的。

然而不管怎么移动,步数是固定的。

那我们就把最前面的0和最后面的1交换

假设0在i,1在j。我们交换的代价就是min(y,x*(j-i))

然后累加求和就好了!

很棒的脑洞题!

代码:

#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
#define ll __int64
using namespace std;
ll v1[123456];
char v[123456];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll x,y;
        scanf("%I64d%I64d",&x,&y);
        scanf("%s",v);
        int len=strlen(v);
        int cnt=0;
        for(int i=len-1;i>=0;i--) if(v[i]=='1') v1[cnt++]=(ll)i; //找全部1的位置
        ll ans=0;
        int j=0;  //处理到第几个1
        for(int i=0;i<cnt;i++)
        {
            if(v[i]=='0') ans+=min((v1[j++]-i)*x,y);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}
时间: 2024-10-09 06:11:43

[思路题+贪心] fzu oj 2197 最小花费的相关文章

FZU 2197 最小花费 (模拟)

[题目链接]:click here~~ [题目大意]: 给一个长度为n(n <= 10^5)的"01"串,你可以任意交换一个为0的位和一个为1的位,若这两位相邻,花费为X,否则花费为Y.求通过若干次交换后将串中的"1"全部变换到"0"前面的最小花费. [解题思路]:看到题以为是道考算法的,想了想,朴素算法O(n^2)绝逼超时啊~~其实模拟一下,因为达到最终状态的只有一种,因此移动的步数是一定的,所以每次交换最前面的0和最后面的1,然后分别记

第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解

[问题描述] C国共有$n$个城市.有$n-1$条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了$m$条旅行的路线, 第$i$条旅行路线的起点是$s_i$,终点是$t_i$.在旅行过程中,小R每行走一单位长度的路需要吃一单位的食物.C国的食物只能在各个城市中买到,而且不同城市的食物价格可能不同. 然而,小R不希望在旅行中为了购买较低价的粮食而绕远路,因此他总会选择最近的路走.现在,请你计算小R规划的每条旅行路线的最小花费是多少. [输入格式] 第一行包含

15年3月CCF真题5-最小花费

问题描述 C国共有n个城市.有n-1条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了m条旅行的路线,第i条旅行路线的起点是si,终点是ti.在旅行过程中,小R每行走一单位长度的路需要吃一单位的食物.C国的食物只能在各个城市中买到,而且不同城市的食物价格可能不同. 然而,小R不希望在旅行中为了购买较低价的粮食而绕远路,因此他总会选择最近的路走.现在,请你计算小R规划的每条旅行路线的最小花费是多少. 输入格式 第一行包含2个整数n和m. 第二行包含n个整数.

一道超级坑爹的水题(ACdream oj 无耻的出题人)

 A - 无耻的出题人 Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 65536/32768 KB (Java/Others) Submit Status Problem Description 听到X神要参加比赛,只会Fibnacci数的出题人被吓得哭晕在厕所.为了防止X神AK(ALL KILL)比赛题目,无耻的出题人只好在题面上做些手脚(加密).其中一道题的题目描述如下: hjxh dwh v vxxpde,mmo i

洛谷—— P1576 最小花费

P1576 最小花费 题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. 输入输出格式 输入格式: 第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数. 以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z<100). 最后一行输入两个正整数A,B.数据保证A与B之间可以直接或

Poj 2516 Minimum Cost (最小花费最大流)

题目链接: Poj  2516  Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求量.不同的商店从不同的仓库购买不同货物花费不同,问是不是能满足所有商店的要求,如果能商店花费总和最小为多少? 解题思路: 简单的费用流,要跑K次最小花费最大流,每次只对一种货物建图跑费用流.每次建图以0为源点, [1,m]为仓库, [m+1, n+m]为商店, n+m+1为汇点.0与[1,m]连边,

把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend

1 //把一个序列转换成严格递增序列的最小花费 CF E - Sonya and Problem Wihtout a Legend 2 //dp[i][j]:把第i个数转成第j小的数,最小花费 3 //此题与poj 3666相似 a[i]转换成a[i]-i 4 5 #include <iostream> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <algorithm> 9 #include <

POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思路:比较简单的区间DP,令dp[i][j]表示使[i,j]回文的最小花费.则得到状态转移方程: dp[i][j]=min(dp[i][j],min(add[str[i]-'a'],del[str[i]-'a'])+dp[i+1][j]); dp[i][j]=min(dp[i][j],min(add[

AOJ2249 最短路+最小花费(双权值)

写题解之前先骂一下这道题 xxx给数据范围点数<1e4,边数<2e4,结果我开2e4和3e4都RE,然后找问题一个多小时,最后我开了1e5和2e5,题面太能唬人了吧!?真是sb题面 ------------------------------------------分割线------------------------------------ 题目大意:给n个点和m条边,每条边给了起始点,距离和价格,求在保证点1到其他n-1个点的路径都是最短路的前提下所有路的价格之和的最小值 简单的Dijks