4月27日星期四
一、第一周任務(wù) - Virtual Judge (vjudge.net)
1、這題是一個對字符串特殊操作的題,字符串由'^'和‘_’組成,現(xiàn)給定你原字符串a(chǎn)問你要使字符串,變成由連續(xù)的^^或^_^組成的笑臉字符串,問你要在原字符串中添加多少次'^'和‘_’。
2、我們可以建立一個標(biāo)記字符串b,在對a從左往右遍歷時特殊判斷,當(dāng)為’^‘時直接入b,但當(dāng)是’_‘時,判斷b后是否也是'_',是就要加入'^',sum++;
3、(1、)也要注意細(xì)節(jié),開頭和結(jié)尾的特判,當(dāng)a[0]=='_',就要提前b入’^‘,sum++;
? ?(2、)或b結(jié)尾是'_',sum++;
? ?(3、)或a的長度是1,是'^',sum++;
附代碼
#include <iostream> #include<algorithm> #include<string.h>using namespace std;main(){int n;cin>>n;getchar();while(n--){int sum=0,x=0,cd;char str[105],jl[210];gets(str);cd=strlen(str);if(str[0]=='^')jl[x]='^';if(str[0]!='^'){jl[x]='^';sum++;}for(int i=0;i<cd;i++){if(str[i]=='_'&&jl[x]=='_'){jl[++x]='^';jl[++x]=str[i];sum++; }else if(str[i]=='_'&&jl[x]=='^'){jl[++x]=str[i];}else {jl[++x]=str[i];}}if(jl[x]=='_'||(jl[0]=='^'&&cd==1))sum++;cout<<sum<<endl;} }二、第一周任務(wù) - Virtual Judge (vjudge.net)
1、這題其實就是給你一個字符串a(chǎn)找出其中最大連續(xù)的1的數(shù)量長度len,每往右移時組成的最大矩陣的面積。
2、我們首先求原a的len的特殊情況len=0,或len=a的長度時的面積0或len*len;
3、因為題目的一個特殊性,比如101的len=2,是因為它是循環(huán)右移,為了方便直接a+=a,求它的len;
4、再然后細(xì)心觀察就是一個面積公式原面積公式i=1,len*i,每往右移時(len-1)*i++,長*寬,注意len是偶/奇數(shù)是長寬一點區(qū)別,此時注意長寬怎么取能是面積最大。
附代碼
#include <iostream> #include <algorithm>using namespace std;main(){int n;cin>>n;while(n--){string str;long long max=0,cd,sum=0;cin>>str;cd=str.size();for(int i=0;i<cd;i++){if(str[i]=='1')sum++;else sum=0;if(sum>max)max=sum;}if(max==0){cout<<0<<endl;continue;}if(max==cd){long long z=max*max;cout<<z<<endl;continue;}str+=str;max=sum=0;for(int i=0;i<str.size();i++){if(str[i]=='1')sum++;else sum=0;if(sum>max)max=sum;}if(max%2==0){long long z=((max/2)*(max/2+1));cout<<z<<endl;}else{long long z=((max/2+1)*(max/2+1));cout<<z<<endl;}} }三、第一周任務(wù) - Virtual Judge (vjudge.net)
1、這題我們首先要注意MEX()是什么意思,是說,在一個序列內(nèi),未出現(xiàn)過的最小自然數(shù)
例如(3 2 0 2)mex=1? ? ? ? ? (1 2 1)mex=0;
2、這題是說我們求出給定的原序列a:mex后,對序列a的某一個子區(qū)間賦一個值得到b,使得b在求mex后比原mex大1;如果能夠有這樣的一次操作滿足上述條件輸出”YES“,否則輸出”NO“;
3、其實我們就只需要考慮兩部分一個是在a中大于mex+1的部分,一個是小于mex的部分,這兩部分在a中的一個最大范圍區(qū)間;
4、因為我們要時賦值后的mex+1,就最起碼要將a中mex+1的最大區(qū)間全部賦值成mex,而且還要使小于mex的部分不被影響,才能使mex+1;
5、我們就可以嘗試將最大區(qū)間賦值為mex,然后在求b的mex。看是否加了1,就知道了結(jié)果;
6、同時還要注意幾個特殊判斷
(1、)mex=0,"YES";a的長度=1但mex!=0,"NO";
(2、)當(dāng)mex是序列中最大的值時例如(0,1,2,3)mex=4;這是就要考慮mex的值和序列的長度問題,如果mex時最大值,就證明序列時從0開始的遞增為1的序列,如果mex==a的長度就”NO“,
小于就證明有重復(fù)的數(shù)只需將重復(fù)的隨便一個改為mex就能使mex+1;
附代碼
#include <iostream> #include <algorithm> #include <map>using namespace std;map<int,int>p;int ma;int mex() { for(int i=0;i<ma;i++)if(p[i]!=1)return i;return ma+1; }main() { int n;cin>>n;while(n--){ma=0;p.clear();int cd,jl[200005];cin>>cd;for(int i=0;i<cd;i++){cin>>jl[i];p[jl[i]]=1;if(jl[i]>ma)ma=jl[i];}int me=mex();if(cd==1&&me!=0){cout<<"NO"<<endl;continue;}if(me==0){cout<<"YES"<<endl;continue;}int dl=-1,dr=-1;for(int i=0;i<cd;i++)if(jl[i]==me+1){dl=i;break;}for(int i=cd-1;i>=0;i--)if(jl[i]==me+1){dr=i;break;}if(dr==-1&&dl==-1)if(cd>me){cout<<"YES"<<endl;continue;}else{cout<<"NO"<<endl;continue;}p.clear();ma=0;for(int i=dl;i<=dr;i++)jl[i]=me;for(int i=0;i<cd;i++){if(jl[i]>ma)ma=jl[i];p[jl[i]]=1;}int h=mex();if(h==me+1)cout<<"YES"<<endl;else cout<<"NO"<<endl;} }總結(jié)
- 上一篇: 是什么样的奔驰销售经理逼出一个“博士后”
- 下一篇: Apache Guacamole 远程桌