目录
094:素数回文
095:活动安排
096:合唱团
094:素数回文
题目链接:素数回文_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
模拟题:
1.构造回文数
2.检测是否为素数
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
long long change(string s)
{
for(int i=s.size()-2;i>=0;i--)
{
s+=s[i];
}
return stol(s);
}
bool isprime(long long x)
{
if(x<=1) return false;
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0) return false;
}
return true;
}
int main()
{
string s;
cin>>s;
long long x=change(s);//回文数
if(isprime(x)) cout<<"prime"<<endl;
else cout<<"noprime"<<endl;
return 0;
}
095:活动安排
题目链接:活动安排_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
排序+贪心
1.将同一个活动的开始时间和结束时间组成一个pair<LL,LL>,将pair排序后,逐个分情况讨论
2.当前一个活动的结束时间晚于后一个活动的开始时间,活动重叠,ret不变,同时更新两个活动结束时间的较早值(最先结束的活动),好与再后一个活动比较。
3.当前一个活动的结束时间早于后一个活动的开始时间,活动不重叠,ret++。
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PLL;
const int N=2e5+10;
int n;
PLL arr[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i].first;
cin>>arr[i].second;
}
sort(arr,arr+n);
LL ret=1,r=arr[0].second;
for(int i=1;i<n;i++)
{
if(r>arr[i].first) //有重叠
{
r=min(r,arr[i].second);
}
else //没有重叠
{
ret++;
r=arr[i].second;
}
}
cout<<ret<<endl;
return 0;
}
096:合唱团
题目链接:合唱团_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
区间dp:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=55,M=15;
const LL INF=0x3f3f3f3f3f3f3f3f; //足够大的数
int k,d,n;
LL arr[N];
LL f[N][M],g[N][M];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>arr[i];
cin>>k>>d;
for(int i=1;i<=n;i++) //填写每一行
{
f[i][1]=g[i][1]=arr[i];
for(int j=2;j<=min(i,k);j++) //挑选几个人
{
f[i][j]=-INF;
g[i][j]=INF;
for(int prev=max(i-d, j-1);prev<=i-1;prev++) //i前面一个被挑选的人
{
f[i][j]=max(max(f[prev][j-1]*arr[i], g[prev][j-1]*arr[i]), f[i][j]);
g[i][j]=min(min(g[prev][j-1]*arr[i], f[prev][j-1]*arr[i]), g[i][j]);
}
}
}
LL ret=-INF;
for(int i=k;i<=n;i++) ret=max(f[i][k],ret); //遍历一遍,求乘积最大
cout<<ret<<endl;
return 0;
}