A.游游的最长稳定子数组
原题链接 :
登录—专业IT笔试面试备考平台_牛客网
思路 :
一个线性dp,dp[i]表示以a[i]结尾的最长稳定子数组的长度;
dp方程 :
if(abs(a[i]-a[i-1]) <= 1) dp[i]=dp[i-1]+1;
else dp[i] = 1;
代码 :
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); }
int lcm(int a,int b){ if(a==0||b==0) return 0; return (a*b)/gcd(a,b); }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
//numbers.erase(std::unique(numbers.begin(), numbers.end()), numbers.end()); // 去重操作
const int N = 1e5+10;
int a[N];
int dp[N];
inline void solve(){
int n ; cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
dp[1] = 1;
for(int i=2;i<=n;i++){
if(abs(a[i]-a[i-1]) <= 1) dp[i]=dp[i-1]+1;
else dp[i] = 1;
}
int ma = 0;
for(int i=1;i<=n;i++){
ma = max(ma,dp[i]);
}
cout<<ma<<endl;
return ;
}
int main()
{
IOS
int _;
// cin >> _;
_ = 1;
while(_ --) solve();
return 0;
}
B.游游的字符重排
原题链接 :
登录—专业IT笔试面试备考平台_牛客网
思路 :
-
写一个判断函数pd()判断字符串s是不是一个好串;
-
对字符串s的全排列中的每个字符串,进行判断,pd(s )为true,则ans++;
-
可以用next_permutation来实现全排列(可以记住);
代码 :
#include<bits/stdc++.h>
using namespace std;
string s;int n;
int ans = 0;
bool pd(string s){
for(int i=1;i<s.size();i++) if(s[i] == s[i-1]) return false;
return true;
}
int main(){
cin>>s ; n=s.size();
sort(s.begin(),s.end());
do{
if(pd(s)) ans ++;
}while(next_permutation(s.begin(),s.end()));
cout<<ans<<endl;
}
游游开车出游
原题链接 :
登录—专业IT笔试面试备考平台_牛客网
思路 :
所以 : 分v^2>xy和v^2<=xy两种情况即可!
详情请看代码 :
代码 :
#include <bits/stdc++.h>
using namespace std;
long double v,x,y;
int main() {
cin >> v >> x >> y;
if(pow(v,2) > x*y ) printf("%.7llf",y/v);
else printf("%.7llf",2*sqrt(y/x) - v/x);
}
注意 :
- 变量类型要用long double 来定义
- 1e-6保留7位小数即可
游游的回文子串
原题链接 :
登录—专业IT笔试面试备考平台_牛客网
思路 :
- 首先对于第 i 个串中的回文子串进行记录,那么对于一个长度为a[i]的相同字符串,其回文串的数量是1+2+3+...+a[i],也就是(1+a[i])*a[i]/2;
- 然后再判断是否存在i串与相邻两串形成回文串的可能,令l=i-1,r=i+1 ; 如果a[l]!=a[r],回文串的数量为min(a[l] , a[r]);如果相等,加上a[l]或a[r],然后l--,r++即可;
详情请看代码 :
代码 :
#include<bits/stdc++.h>
using namespace std;
const int N = 1007,MOD = 1e9+7;
typedef long long LL;
LL n,a[N];
int main(){
scanf("%lld",&n);
LL ans = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
ans = ( ans + (1+a[i])*a[i]/2) % MOD;
}
for(int i=2;i<n;i++){
int l = i-1,r=i+1;
while(l>=1&&r<=n){
ans=(ans+min(a[l],a[r]) ) % MOD;
if(a[l] != a[r]) break;
l--;
r++;
}
}
cout<<ans;
}