Codeforces Round #613题解
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相邻的两个数。
官方简单题解:只需枚举X的约数,再判断即可,因为答案必定为两个约数。
#include <bits/stdc++.h> using namespace std; #define finish(x) return cout << x << endl, 0 #define ll long long ll x; ll lcm(ll a, ll b){ return a / __gcd(a, b) * b; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> x; ll ans; for(ll i = 1 ; i * i <= x ; i++){ if(x % i == 0 && lcm(i, x / i) == x){ ans = i; } } cout << ans << " " << x / ans << endl; }
#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; } }
#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; } }
没有人不辛苦,只有人不喊疼