标签:否则 define min ORC 一个 最小值 i++ 吉利 tle
紫名祭
又加了66分,这个数字还是很吉利的。不过这次的赛制是div.2紫名不能参加,对我还是有利的。
只不过这次的D题有点坑,没想到随便找个规律就行了。。。
A题:
满足要求的数的末尾必须是奇数,但要数字和为偶数,所以除了最后一位肯定还有一个奇数。
所以直接在原数中找两个奇数,找不到则输出-1.
上代码:
1 #pragma GCC optimize("Ofast,unroll-loops") 2 #include<bits/stdc++.h> 3 #define ll long long 4 #define F first 5 #define S second 6 #define P pair 7 #define FOR(i,a,b) for(int i=a;i<=b;i++) 8 #define V vector 9 #define RE return 10 #define ALL(a) a.begin(),a.end() 11 #define MP make_pair 12 #define PB push_back 13 #define PF push_front 14 #define FILL(a,b) memset(a,b,sizeof(a)) 15 using namespace std; 16 void solve(){ 17 int len; 18 string s; 19 cin>>len>>s; 20 int ans1=-1; 21 for(int i=0;i<len;i++){ 22 int t=s[i]-‘0‘; 23 if(t&1){ 24 if(ans1==-1){ 25 ans1=t; 26 }else{ 27 cout<<ans1<<t<<‘\n‘;RE ; 28 } 29 } 30 } 31 cout<<"-1\n"; 32 } 33 int main(){ 34 ios::sync_with_stdio(0); 35 cin.tie(0); 36 int n; 37 cin>>n; 38 while(n--)solve(); 39 RE 0; 40 }
B题:
因为这里不用考虑步数的问题,我们可以把左右两端的数都设为0,再一个一个向中间加1,如果有一个数它既比从左边过来的数小,也比右边过来的数小,那么就输出No,否则输出Yes。
上代码:
1 #pragma GCC optimize("Ofast,unroll-loops") 2 #include<bits/stdc++.h> 3 #define ll long long 4 #define F first 5 #define S second 6 #define P pair 7 #define FOR(i,a,b) for(int i=a;i<=b;i++) 8 #define V vector 9 #define RE return 10 #define ALL(a) a.begin(),a.end() 11 #define MP make_pair 12 #define PB push_back 13 #define PF push_front 14 #define FILL(a,b) memset(a,b,sizeof(a)) 15 using namespace std; 16 int a[300005],n; 17 void solve(){ 18 cin>>n; 19 FOR(i,1,n)cin>>a[i]; 20 int l=1,r=n,t=0; 21 while(a[l]>=t){ 22 t++;l++; 23 } 24 l--;t=0; 25 while(a[r]>=t){ 26 r--;t++; 27 } 28 r++; 29 if(r<=l)cout<<"Yes\n";else cout<<"No\n"; 30 } 31 int main(){ 32 ios::sync_with_stdio(0); 33 cin.tie(0); 34 int t; 35 cin>>t; 36 while(t--)solve(); 37 RE 0; 38 }
C题:
这题可以直接枚举我指定多少人取第一个,再枚举剩下的人有多少人取第一个,这样就可以算出我现在可以取的值,再取一个大的。枚举我指定的人时,可以取最大值,但是枚举剩下的人时,就必须取最小值,只要脑子绕过来了就好了。
上代码:
1 #pragma GCC optimize("Ofast,unroll-loops") 2 #include<bits/stdc++.h> 3 #define ll long long 4 #define F first 5 #define S second 6 #define P pair 7 #define FOR(i,a,b) for(int i=a;i<=b;i++) 8 #define V vector 9 #define RE return 10 #define ALL(a) a.begin(),a.end() 11 #define MP make_pair 12 #define PB push_back 13 #define PF push_front 14 #define FILL(a,b) memset(a,b,sizeof(a)) 15 using namespace std; 16 int a[3505],n,m,k; 17 void solve(){ 18 cin>>n>>m>>k;m--;k=min(k,m); 19 FOR(i,1,n)cin>>a[i]; 20 int maxi=0; 21 FOR(i,0,k){ 22 int l=i+1,r=n-k+i; 23 int mini=2147483647; 24 FOR(j,0,m-k){ 25 mini=min(mini,max(a[l+j],a[r-m+k+j])); 26 } 27 maxi=max(maxi,mini); 28 } 29 cout<<maxi<<‘\n‘; 30 } 31 int main(){ 32 ios::sync_with_stdio(0); 33 cin.tie(0); 34 int t; 35 cin>>t; 36 while(t--)solve(); 37 RE 0; 38 }
D题:
这题的方法有些像是找规律,如果一段长度为1,则输出“Yes”,计算一段中每种字符有多少个,字符种类超过3则肯定不行。字符种类为1,因为前面单个的已经被特判掉了,所以输出“No”;种类为2,如果头尾相同输出“No”,否则输出“Yes”。我是找规律的,至于为什么这样,我也说不清楚。
上代码:
1 #pragma GCC optimize("Ofast,unroll-loops") 2 #include<bits/stdc++.h> 3 #define ll long long 4 #define F first 5 #define S second 6 #define P pair 7 #define FOR(i,a,b) for(int i=a;i<=b;i++) 8 #define V vector 9 #define RE return 10 #define ALL(a) a.begin(),a.end() 11 #define MP make_pair 12 #define PB push_back 13 #define PF push_front 14 #define FILL(a,b) memset(a,b,sizeof(a)) 15 using namespace std; 16 int f[200005][26],t[26]; 17 int main(){ 18 ios::sync_with_stdio(0); 19 cin.tie(0); 20 string s; 21 cin>>s; 22 int q; 23 cin>>q; 24 int l,r; 25 f[0][s[0]-‘a‘]=1; 26 for(int i=1;i<s.size();i++){ 27 FOR(j,0,25)f[i][j]=f[i-1][j]; 28 f[i][s[i]-‘a‘]++; 29 } 30 FOR(i,1,q){ 31 cin>>l>>r; 32 if(l==r){ 33 cout<<"Yes\n";continue; 34 } 35 l--;r--; 36 FOR(j,0,25)t[j]=f[r][j]-f[l][j]; 37 t[s[l]-‘a‘]++; 38 int count=0; 39 FOR(j,0,25){ 40 if(t[j])count++; 41 } 42 if(count>2){ 43 cout<<"Yes\n"; 44 }else{ 45 if(count==1){ 46 cout<<"No\n"; 47 }else{ 48 if(s[l]==s[r]){ 49 cout<<"No\n"; 50 }else cout<<"Yes\n"; 51 } 52 } 53 } 54 RE 0; 55 }
下次比赛用小号,以防好不容易才拿到的紫名丢了。
标签:否则 define min ORC 一个 最小值 i++ 吉利 tle
原文地址:https://www.cnblogs.com/njwsf/p/12254702.html