zzulioj-1961-取硬币【思维】【贪心】
来源:互联网 发布:信用卡淘宝支付限额 编辑:程序博客网 时间:2024/06/05 20:39
题目链接:点击打开链接
1961: 取硬币
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 46 Solved: 6
SubmitStatusWeb Board
Description
n个硬币排成一排,你可以取走其中连续的一段硬币,但必须要求这段硬币中正面朝上的个数等于反面朝上的个数,那么你最多可以取走多少枚硬币?
Input
多组实例测试,每组输入一个01字符串(长度小于1000000),其中0表示反面朝上,1表示正面朝上
Output
对于每组数据,输出能取走的最多硬币数量
Sample Input
10110
Sample Output
Case #1: 4
思路:
令temp为当前1的个数与0的个数的差(可以为负,例如1的个数为5,0的个数为8,那么差就为-3),
那么只需要从左到右遍历一遍字符串,不停更新temp值即可,只要这个temp值之前出现过,就说明中间这一段0和1的个数一定相等
比如str[] = "110101111":
我们设i=xi表示当前遍历到第xi个字符
xi=1时,a=1,b=0,temp=1
xi=2时, a=2,b=0,temp=2
xi=3时, a=2,b=1,temp=1(和x1=1时相等,那么找到一个01相等串,长度为2)
xi=4时, a=3,b=1,temp=2(和x1=2时相等,那么又找到一个01相等串,长度也为2)
xi=5时, a=3,b=2,temp=1(和x1=1时相等,找到一个01相等串,长度为4!更优)
.......
xi=7, a=5,b=2,temp=3
xi=8, a=6,b=2,temp=4 ……
综上,答案为4!
PS:用一个数组p[2000005]来存temp的值,因为temp可以为负,所以我们将temp总体+1000000,,p[temp]=5表示temp值最早出现在下标为5的地方
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int MAXN=1e6+10;char str[MAXN];int pos[2*MAXN]; // pos[i]=j :记录第一次出现 0 与 1 差值为 i的位置为 j int main(){int text=0;while(~scanf("%s",str+1)){//printf("%d--\n",strlen(str+1));memset(pos,0,sizeof(pos));int cnt0=0,cnt1=0,ans=0;for(int i=1;str[i];i++){if(str[i]=='0')cnt0++;elsecnt1++;int k=cnt0-cnt1+MAXN;if(pos[k]||cnt0==cnt1){ans=max(ans,i-pos[k]);}elsepos[k]=i;}printf("Case #%d: %d\n",++text,ans);}return 0;}
0 0
- zzulioj-1961-取硬币【思维】【贪心】
- zzulioj-1917-E【思维】
- zzulioj 1898 (数学+思维)
- zzulioj-1959-数组最大值【思维】
- zzulioj-1962-翻杯子【思维】
- 贪心算法-找硬币
- 蓝桥杯 翻硬币(贪心)
- 翻硬币(贪心)
- 翻硬币 贪心
- 【贪心】---【反硬币】
- 蓝桥杯 翻硬币 贪心
- 贪心算法:硬币问题
- 硬币问题(贪心)
- 蓝桥杯 翻硬币(贪心)
- 翻硬币(贪心)
- 硬币问题 (贪心)
- 翻硬币---贪心
- 翻硬币(贪心)
- 文本省略处理
- Android 优先级和应用程序生命周期
- 给HttpServletRequest传参的方法
- socket与http的区别
- JavaScript learning notes
- zzulioj-1961-取硬币【思维】【贪心】
- windows 虚拟机克隆后修改SID
- 深度卷积网络的几个构型讨论
- Unity中关于Device Filter的选择问题
- Tomcat源码分析(二)------ 一次完整请求的里里外外
- Hadoop简介
- STC系列单片机烧录
- fMRI数据分析处理原理及方法
- sql 分组后按时间降序排列再取出每组的第一条记录