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;
}