A题
签到水题
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> #include<vector> #include<cstdio> using namespace std; const int N=105; int main(){ int n; string s; cin>>n; cin>>s; int i; int num1=0,num2=0; for(i=0;i<s.size();i++){ if(s[i]=='L') num1++; else num2++; } cout<<num2+num1+1<<endl; }
B题
由题意只需要求出一段长度和最大值即可,但是不能是全部长度,可以将它转化为在1--n-1和2--n求。
注意答案可能负数,大数据建议开long long
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> #include<vector> #include<cstdio> using namespace std; const int N=100005; const int inf=0x3f3f3f3f; typedef long long ll; int s[N]; int main(){ int t; cin>>t; while(t--){ memset(s,0,sizeof s); int p[N]; int n; cin>>n; int i; ll sum=0; for(i=1;i<=n;i++){ cin>>p[i]; sum+=p[i]; } ll flag=0; ll ans=-inf; for(i=1;i<=n-1;i++){ flag+=p[i]; ans=max(ans,flag); if(flag<0){ flag=0; } } flag=0; for(i=2;i<=n;i++){ flag+=p[i]; ans=max(ans,flag); if(flag<0){ flag=0; } } if(sum>ans) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
C题
求最小公倍数是否为X,注意思路转化,如果暴力求解每两个数的最小公倍数会超时。
根据公式定义 lcm(a,b)=a/gcd(a,b)*b
因此可以将a/gcd(a,b)当作枚举变量
注意输入数据可能为素数
另外,判断素数需要加速,否则会TLE,学到了一个新招叫做六素数法
原理:每个数都可以表述为6n,6n+1,6n+2,6n+3,6n+4,6n+5且素数只能为6n相邻的两个数。
#include<iostream> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<map> #include<vector> #include<cstdio> using namespace std; const int N=100005; const int inf=0x3f3f3f3f; typedef long long ll; ll x; ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b); } bool isprime(long long x){ if(x<=3) return x>1; else{ if(x%6!=1&&x%6!=5) return false; else{ long long k=sqrt(x); for(int i =5;i<=k;i+=6){ if(x%i==0||x%(i+2)==0) return false; } } } return true; } int main(){ cin>>x; ll i; if(x==1||isprime(x)) cout<<1<<" "<<x<<endl; else{ ll m1=1,m2=x; for(i=1;i<=sqrt(x);i++){ if(x%i!=0) continue; ll b=x/i; if(gcd(b,i)==1){ if(b<m2){ m2=b; m1=i; } } } cout<<m1<<" "<<m2<<endl; } }