题目 | 难度 | 知识点 |
---|---|---|
A 游游的最长稳定子数组 | ★ | 双指针 |
B 游游的字符重排 | ★ | 全排列 |
C 游游开车出游 | ★ | 三分 |
D 游游的回文子串 | ★★ | 双指针 |
C题不会,不会数学忘完了,但是其实容易分析出来可以用数学求极值点,但是还可以用三分搞。
D题也不会,其实比较简单,双指针搞一下就行了。C题三分没学不会情有可原,D题不会有点拉胯。太菜了呀。。呜呜呜呜
游游的最长稳定子数组
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],n,ans;
int main(void)
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
int j=i;
while(j+1<n&& abs(a[j+1]-a[j])<=1) j++;
ans=max(ans,1ll*j-i+1);
i=j;
}
cout<<ans;
return 0;
}
游游的字符重排
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
string s;
int ans=0;
int main(void)
{
cin>>s;
sort(s.begin(),s.end());
do
{
int flag=1;
for(int i=1;i<s.size()-1;i++)
{
if(s[i]==s[i-1]) flag=0;
if(s[i]==s[i+1]) flag=0;
}
ans+=flag;
}while(next_permutation(s.begin(),s.end()));
cout<<ans;
return 0;
}
游游开车出游
#include<bits/stdc++.h>
using namespace std;
double v0,x,y;
double check(double t)
{
return y/(v0+x*t)+t;
}
int main(void)
{
cin>>v0>>x>>y;
double l=0,r=1e9;
while(r-l>1e-9)
{
double mid1=l+(r-l)/3;
double mid2=r-(r-l)/3;
if(check(mid1)>check(mid2)) l=mid1;
else r=mid2;
}
printf("%.7lf",check(l));
return 0;
}
游游的回文子串
分两种情况:
- 同一个区域, 长度为n, 方案数n*(n+1)/2,例如,
111
可以形成1
,1
,1
,11
,11
,111
共 6 个回文子串 - 以某个区域为中心,往两边扩展,则线性增长
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
const int mod=1e9+7;
typedef long long int LL;
LL a[N],n,ans;
int main(void)
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
ans=(ans+(__int128)a[i]*(a[i]+1)/2)%mod;//这个区域的回文串个数
for(int j=1;i+j<n&&i-j>=0;j++)//以该区间为中心,向外扩展
{
if(a[i-j]==a[i+j]) ans=(ans+a[i-j])%mod;//对称相等,继续扩展
else{//不相等,加上相等的那一部分退出
ans=(ans+min(a[i-j],a[i+j]))%mod;
break;
}
}
}
cout<<ans;
return 0;
}