[codeforces 1369B] AccurateLee 尋找左邊界的1,右邊界的0

Codeforces Round #651 (Div. 2)  參與排名人數14559

[codeforces 1369B]    AccurateLee   尋找左邊界的1,右邊界的0

總目錄詳見https://blog.csdn.net/mrcrack/article/details/103564004

在線測評地址http://codeforces.com/contest/1369/problem/B

Problem Lang Verdict Time Memory
B - AccurateLee GNU C++17 Accepted 30 ms 3900 KB

題目大意:給定01字串,在字串中,若遇到10即可壓縮爲1或0,輸出壓縮後,在所有最短的字串中選擇字典序最小的字符串輸出。

樣例模擬如下

10
0001111111

0001111111

位置12345678910
數值0001111111
自左往右查找,第一個1出現的位置l=4,
自右往左查找,第一個0出現的位置r=3,
不符合l<r,故字串無壓縮,直接輸出0001111111

4
0101

001

位置1234
數值0101
自左往右查找,第一個1出現的位置l=2,
自右往左查找,第一個0出現的位置r=3,
符合l<r,故區間[2,3]中的字串10可壓縮爲0,故字串壓縮後,輸出001

8
11001101

01

位置12345678
數值11001101

自左往右查找,第一個1出現的位置l=1,
自右往左查找,第一個0出現的位置r=7,
符合l<r,故區間[1,7]中的字串1100110可壓縮爲0,故字串壓縮後,輸出01

10
1110000000

0

位置12345678910
數值1110000000

自左往右查找,第一個1出現的位置l=1,
自右往左查找,第一個0出現的位置r=10,
符合l<r,故區間[1,10]中的字串1110000000可壓縮爲0,故字串壓縮後,輸出0

1
1

1

位置1
數值1

自左往右查找,第一個1出現的位置l=1,
自右往左查找,第一個0出現的位置r,找不到,
不符合l<r,故字串無壓縮,直接輸出1

AC代碼如下:

#include <stdio.h>
#define maxn 100010
char s[maxn];
void solve(){
	int n,i,l,r;
	scanf("%d%s",&n,s+1);
	l=r=-1;
	for(i=1;i<=n;i++)
		if(s[i]=='1'){l=i;break;}//尋找左邊界的1
	for(i=n;i>=1;i--)
		if(s[i]=='0'){r=i;break;}//尋找右邊界的0
	if(l!=-1&&r!=-1&&l<r){//有壓縮的情況
		for(i=1;i<l;i++)printf("%c",s[i]);
		for(i=r;i<=n;i++)printf("%c",s[i]);
		printf("\n");
	}else printf("%s\n",s+1);//無壓縮的情況
}
int main(){
	int t,n;
	scanf("%d",&t);
	while(t--)solve();
	return 0;
}

 

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