HDU 3183 A Magic Lamp (单调队列)

来源:互联网 发布:如何复制淘宝图片 编辑:程序博客网 时间:2024/06/07 11:24

题目链接:HDU 3183 A Magic Lamp

题意:给定一串数字和一个n。删去n个数字,数字的位置不能变,要求剩下的数字组成的一个数最小,输出这个数。

单调队列来维护这个序列递增,弹出队列的的元素是删去的。

注意:前导0的处理 和 答案是0的处理


AC代码:


#include<stdio.h>#include<string.h>int delzero(int *a,int p){int i=p;while(!a[i]) i++;return i;}int main(){int n,len,i,p;char str[1010];int head,tail;int que[1010], num[1010];while(scanf("%s %d",str,&n)!=EOF){len=strlen(str);for(i=0;i<len;i++)num[i]=str[i]-'0';head=1,tail=0;int pos=0;for(i=0;i<len;i++){while(head<=tail && num[i]<que[tail]){tail--;n--;if(n==0)break;}if(n==0){pos=i;break;}que[++tail]=num[i];}if(!pos){p=1;while(!que[p]) p++; for(i=p;i<=tail-n;i++)printf("%d",que[i]);if(p>(tail-n))printf("0");}else{p=delzero(&que[0],1);int mark=0;for(i=p;i<=tail;i++){printf("%d",que[i]);mark=1;}p=pos;if(!mark){p=delzero(&num[0],pos);if(p>=len){printf("0\n");continue;}}for(i=p;i<len;i++)printf("%d",num[i]);}printf("\n");}return 0;}/*178543 4 1000001 1100001 212345 254321 21000 186541523 3861523 3213 1*/


1 0
原创粉丝点击