A. Reverse a Substring
题意:给你一个字符串,反转L-R区间里的字符串,使得反转后的字符串的字典序小于原本的字典序;
直接遍历一遍,如果前一个字符>后一个字符就找到符合条件的了~
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int mod=1e9+7; typedef long long ll; int main() { std::ios::sync_with_stdio(false); int n; cin>>n; string s; cin>>s; int a=s[0]; int flag=0; for(int i=1;i<n;i++){ if(s[i]<a){ flag=i; break; } else a=s[i]; } //cout<<flag<<endl; if(flag==0)cout<<"NO"<<endl; else { cout<<"YES"<<endl; cout<<flag<<' '<<flag+1<<endl; } return 0; }
B. Game with Telephone Numbers
题意:给你一串奇位数的数字串,每次从中间删两个数字,问你到最后剩下11位时的数字能否构成一个电话号码;
电话号码的条件是11位数并且第一位必须是8;
直接判断前n-10位的'8'的个数,超过(n-10)/2就可以,反之则不行;
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int mod=1e9+7; typedef long long ll; int main() { std::ios::sync_with_stdio(false); int n; cin>>n; string s; cin>>s; int cnt=0; for(int i=0;i<=n-11;i++){ if(s[i]=='8') cnt++; } if(cnt*2>(n-11)) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }
C. Alarm Clocks Everywhere
题意:给你n个数,xi代表第i件事事情发生的时间,再给m个数pi,选择一个合适的pi使得从闹钟开始每加上pi或者加上几个pi经过所有的xi;
想法:pi一定是所有xi的最大公约数,或者是xi的最大公约数的非质数因子;gcd的复杂度为logn,所有总算法nlogn还行~;
#include <bits/stdc++.h> using namespace std; const int maxn=3e5+10; const int mod=1e9+7; typedef long long ll; ll a[maxn],b[maxn],c[maxn]; ll gcd(ll m,ll n){ while(n!=0){ ll rem=m%n; m=n; n=rem; } return m; } int main() { std::ios::sync_with_stdio(false); int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ scanf("%lld",&a[i]); } for(int i=0;i<m;i++){ scanf("%lld",&c[i]); } for(int i=0;i<n-1;i++){ b[i]=a[i+1]-a[i]; } sort(b,b+n-1); ll ans=gcd(b[0],b[1]); for(int i=2;i<n-1;i++){ ans=gcd(ans,b[i]); } int flag=0; for(int i=0;i<m;i++){ if(ans%c[i]==0){ flag=i+1; break; } } if(flag==0)cout<<"NO"<<endl; else { cout<<"YES"<<endl; cout<<a[0]<<' '<<flag<<endl; } return 0; }
D. Beautiful Array
题意:给你一个n,x;一个长度为n的数组a;可以选择某个区间的数乘x,也可以不选,求区间和的最大值;
~当时认为解法只有dp~~~太弱了,不懂
后来看了大佬的题解发现可以贪心:乘x的区间是固定的,设固定区间是[L,R]所以只要加上1-(L-1)的区间和最大值,加上(R+1,n)的区间和最大值;
#include <bits/stdc++.h> using namespace std; const int maxn=3e5+10; const int mod=1e9+7; typedef long long ll; ll a[maxn],r[maxn],l[maxn]; ll sum[maxn]; int main() { std::ios::sync_with_stdio(false); int n,x; cin>>n>>x; for(int i=1;i<=n;i++){ cin>>a[i]; sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;i++){ l[i]=max(l[i-1]+a[i],(ll)0); } for(int i=n;i>0;i--){ r[i]=max(r[i+1]+a[i],(ll)0); } ll ans=0; ll flag=0; for(int i=1;i<=n;i++){ ans=max(x*sum[i-1]+r[i]-flag,ans); flag=min(sum[i]*x-l[i],flag); } ans=max(ans,sum[n]*x-flag); cout<<ans<<endl; return 0; }