J - Erasing and Winning UVA 11491

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <list>
using namespace std;

list<int> tm;    
list<int>::iterator it,NEXT;
int main()
{
	int i,t,n,j;
	while(scanf("%d%d",&t,&n)!=EOF)
	{	
		tm.clear();   //清空
		getchar(); 
		if (!t&&!n) break; 
		char c; 
		for (i=1;i<=t;i++)
		{
			scanf("%c",&c);
			tm.push_back(c-48);  //构造
		}
		getchar();       //吃掉回车
		NEXT=it=tm.begin();
		NEXT++;
		
		while(n>0&&NEXT!=tm.end() )   
		{  
			while (*it<*NEXT&&NEXT!=tm.end()&&n>0)
			{
				tm.erase(it);
				it=NEXT;
				if (it!=tm.begin()) //此情况下it退后一步,
				{
					it--;
					
				}
				else              //此情况下it无法退后,直接next++
				{
					
					NEXT++;
				} 
				n--;          //n的次数递减
			}
			if (NEXT!=tm.end())
			{
				it++;
				NEXT++;
			}
			if (n<=0) break;
			
		}   
		if (n>0)     //此时若n仍>0,剩下的链表必定是降序数列,直接从最后删除
		{
			it=tm.end();
			it--;
			while(it!=tm.begin()&&n>0)
			{ 
				tm.erase(it);
				n--; 
				it=tm.end();
				it--; 
			}
		} 
		for (it=tm.begin();it!=tm.end();it++)
		{ 
			cout<<*it;
		}
		cout<<endl;
		
	}
	return 0;
	
}

你可能感兴趣的:(J - Erasing and Winning UVA 11491)