目录
088:爱吃素
题目链接:爱吃素 (nowcoder.com)
题目:
题解:
根据素数的性质a*b要为素数,a和b中必有一个1,所以只要判断不是1的那个是不是素数即可,由于数据量太大,判断素数时,x%i 时 i 只需遍历(2~sqrt(x))即可,不然会超时。
#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int T;
LL a,b;
bool isprim(LL x)
{
if(x<2) return true;
//cout<<(LL)sqrt(x)<<endl;
for(LL i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
return false;
}
}
return true;
}
int main()
{
cin>>T;
while(T--)
{
cin>>a>>b;
if(a==1 && b==1)
{
cout<<"NO"<<endl;
}
else if(a==1 || b==1)
{
if(a==1 && b==1)
{
cout<<"NO"<<endl;
}
if(isprim(a) && isprim(b))
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
else if(a!=1 && b!=1)
{
cout<<"NO"<<endl;
}
}
return 0;
}
089:相差不超过k的最多数
题目链接:相差不超过k的最多数_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
排序+滑动窗口
1.进窗口:right++
2.判断:窗口内最大-最小大于k
3.出窗口:left++
4.窗口长度维护ret=max(ret,right-left+1)
#include <iostream>
#include<algorithm>
using namespace std;
const int N=200010;
typedef long long LL;
int n;
LL k;
LL a[N];
int main()
{
cin>>n;
cin>>k;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int left=0,right=0,ret=0;
while(right<n)
{
if(a[right]-a[left]>k)
{
left++;
}
ret=max(ret,right-left+1);
right++;
}
cout<<ret<<endl;
return 0;
}
090:最长公共子序列(一)
题目链接:最长公共子序列(一)_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
动态规划-两个字符串之间的dp问题:
状态表示:dp[i][j]表示字符串s1在 [0,i] 区间和字符串s2在 [0,j] 区间内所有子序列中,最长公共子序列的长度。
状态转移方程:根据最后一个字符划分情况:
a.s[i]==s[j]:dp[i][j]=dp[i-1][j-1]+1
b.s[i]!=s[j]:dp[i][j]=max(dp[i-1][j],dp[i][j-1])
填表:从左到右填(防止dp填表时越界,字符串起始位置应该从下标1开始)
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
char s1[N],s2[N];
int dp[N][N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s1[i];
for(int i=1;i<=m;i++) cin>>s2[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s1[i]==s2[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[n][m]<<endl;
return 0;
}