mioj移除k位最小

小米oj

移除k位最小


描述

有一行由 N 個數字組成的數字字符串,字符串所表示的數是一正整數。移除字符串中的 K 個數字,使剩下的數字是所有可能中最小的。


假設:

字符串的長度一定大於等於 K
字符串不會以 0 開頭


輸入
一行由 N 個數字組成的數字字符串(0 < N < 20),和一個正整數 K(K < N),兩個數據由空格隔開,如:1432219 3。


輸出

移除 K 位後可能的最小的數字字符串。 如 1432219 移除 4, 3, 2 這 3 個數字後得到 1219,爲所有可能中的最小值。


這個題相對來說比較簡單。。。。。。。。。。先是讀出來然後。。。。。從最高位開始,針對每一個位做一個判斷,看這個位能不能被刪除,如果可以就刪並且更新剩餘可以刪除的位數(程序中用a來表示這個參數)

最後再把輸出字符前面的0都給刪掉就好了。。。。。。。。。。。。。。。。。。。。。。。。這個地方有個坑。。。所有數字都是0剩下的也是0不能全刪掉,最後還要輸出0.。。。。。
比如1234567890 0這種組合。。。

#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
int main()
{
	char str1[20],spark[20];
	static int a,len,leave,i,j,k,flag,gggg;//零時中轉
	char line[1000];

	scanf("%s %d",str1,&a);//a爲

	//printf("%s\n", str1);
	len = strlen(str1);

	for (i = 0; i <=len; i++)
	{
		flag = 0;
		for (j = 1; j < a+1; j++)//a位前位向後看
		{
			if (str1[i] > str1[i + j])
				flag = 1;
		}
		if (flag == 1)
		{
			str1[i] = '0';
			a--;
		}
		//printf("%d\n", a);
		else
			spark[k++] = str1[i];
	}
	len = strlen(spark);
	int count = 0;
	for (i = 0; i < len; i++)
	{
		if (spark[i] == '0')
			count++;
	}
	if (count == len)
	{
		printf("0");
		return 0;
	}
	for (i = 0; i < len; i++)
	{
		if (spark[i] == '0')
			//	gggg = 1;
			;
		else gggg = 2;
		if (gggg == 2)
			printf("%c",spark[i]);

	}
	//printf("%d\n", a);
	//printf("%s\n", str1);
	system("pause");
	return 0;

}

這裏的#pragma warning(disable:4996)可以屏蔽掉vs 使用scanf_s的規則。。。。。。。然後system(“pause”)可以讓程序執行完後看結果。。方便調試。。。。。。。。。
。。。。








over.
.
.在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章