[思路题+贪心] fzu oj 2197 最小花费
2015-05-03 17:31
309 查看
题意:
给一个01串,相邻的01交换代价为X,否则为Y。
问把全部1变到0前面的最小费用。
思路:
对于 01011->11100
如果只靠相邻位移动是需要5步的。
然而不管怎么移动,步数是固定的。
那我们就把最前面的0和最后面的1交换
假设0在i,1在j。我们交换的代价就是min(y,x*(j-i))
然后累加求和就好了!
很棒的脑洞题!
代码:
给一个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; }
相关文章推荐
- FZU Problem 2197 最小花费 简单贪心>
- FOJ FZU 2197 最小花费【贪心】
- FZU 2197 最小花费(贪心)
- FZU 最小花费(贪心)
- FZU 2197 最小花费(思维题目)
- FZU 2197 最小花费 (模拟)
- FZU 2102 Solve equation(水,进制转化)&& FZU 2111(贪心,交换使数字最小)
- OJ_1086 最小花费
- 九度oj 1504:把数组排成最小的数 (贪心)
- DP求最小花费 - 九度OJ 1086
- 九度OJ 1086:最小花费 (DP)
- 2017-5-14 湘潭市赛 Parentheses 转化思想+贪心 使括号序列合法的最小花费。满足前面左括号的数量>=有括号的数量。
- nyoj+贪心过河问题+借助于最轻的两个让最胖的过去花费最小。
- 洛谷P2085&ssl1411&OJ1370-最小函数值【堆,贪心】
- 九度OJ 1086:最小花费 (DP)
- 九度OJ 题目1086:最小花费
- foj 2197 最小花费
- H - 最小花费 (简单的贪心吧)
- 九度 oj 题目1086:最小花费
- 洛谷P1576 最小花费x