2024牛客寒假算法基础集训营6
A.
欧拉筛处理出素数
直接3重暴力循环找
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
bool is_prime[N];//是否是质数,0为是,1为不是
int prime[N];//质数数组
int top=1;//质数的下标
int min_p[N];//最小质因数数组
void get_prime(int n){
for(int i=2;i<=n;i++){
if(!is_prime[i]){//是质数
prime[top]=i;//存质数
min_p[i]=i;//质数的最小质因数是本身
top++;//下标后移
}
for(int j=1;j<top;j++){//最小到达遍历质数数组
if(i*prime[j]>n)break;
is_prime[i*prime[j]]=1;//标记质数的倍数即合数
min_p[i*prime[j]]=prime[j];//质数的倍数的最小质因数是该质数
if(i%prime[j]==0)break;//若i是之前质数的倍数,说明这个倍数会在后面的循环内被筛去,无需继续循环
}
}
}
void solve() {
get_prime(1000);
int l,r;cin>>l>>r;
for(int i=1;i<top;i++){
for(int j=i+1;j<top;j++){
for(int k=j+1;k<top;k++){
if(prime[i]>r){
cout<<"-1";
return ;
}
int tmp=prime[i]*prime[j]*prime[k];
if(l<=tmp&&tmp<=r){
// cout<<prime[i]<<' '<<prime[j]<<' '<<prime[k]<<'\n';
cout<<tmp;
return ;
}
}
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
B.
先存入a,b数组,再放到一起排序
遍历找出答案,记录在数组中的下标
两个下标若不同则在a里面把这两个下标对应的数交换
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
#define inf 0x3f3f3f3f
struct node{
int val,fa,id;
}g[N];
bool cmp(node x,node y){
return x.val<y.val;
}
void solve() {
int n;cin>>n;
vector<int>a(n+1),b(n+1);
for(int i=1;i<=n;i++){
cin>>a[i];
g[i].val=a[i];g[i].fa=1;g[i].id=i;
}
for(int i=1;i<=n;i++){
cin>>b[i];
g[i+n].val=b[i];g[i+n].fa=2;g[i+n].id=i;
}
sort(g+1,g+1+2*n,cmp);
int mi=inf,ida,idb;
for(int i=2;i<=2*n;i++){
if(g[i].fa!=g[i-1].fa){
int cha=abs(g[i].val-g[i-1].val);
if(cha<mi){
mi=cha;
if(g[i].fa==1){
ida=g[i].id;
idb=g[i-1].id;
}else{
ida=g[i-1].id;
idb=g[i].id;
}
//cout<<"i="<<i<<'\n';
//cout<<"ida="<<ida<<' '<<"idb="<<idb<<'\n';
}
}
}
//cout<<"ida="<<ida<<' '<<"idb="<<idb<<'\n';
if(ida!=idb)swap(a[ida],a[idb]);
for(int i=1;i<=n;i++)cout<<a[i]<<' ';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
C.
斐波那契数是指数级增长的,第50个就已经超过1e9了
把n在数列中二分,若能找到3个数则可以
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
#define inf 0x3f3f3f3f
map<int,int>mp;
vector<int>dp(60);
void solve() {
vector<int>ans;
int n;
cin >> n;
if(mp[n]){
cout<<n<<" 0 0\n";
return ;
}
int id=lower_bound(dp.begin()+1,dp.begin()+1+50,n)-dp.begin();
id--;
ans.push_back(dp[id]);
n-=dp[id];
if(mp[n]){
cout<<ans[0]<<' ';
cout<<n<<" 0\n";return ;
}
id=lower_bound(dp.begin()+1,dp.begin()+1+50,n)-dp.begin();
id--;
ans.push_back(dp[id]);
n-=dp[id];
if(mp[n]){
cout<<ans[0]<<' '<<ans[1]<<' '<<n<<'\n';
return ;
}
cout<<"-1\n";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
dp[1]=0;dp[2]=1;mp[1]++;mp[0]++;
for(int i=3;i<=50;i++){
dp[i]=dp[i-1]+dp[i-2];
mp[dp[i]]++;
}
// cout<<dp[25];
int left=1;
cin>>left;
while(left--){
solve();
}
}
D.
直接计算
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
long double p;cin>>p;
long double ans=(1-p)*(1-p)*p*p*p+p*p*(1-p)*(1-p)*(1-p);
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
E.
模拟
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f
void solve() {
string x;cin>>x;
int sum=0;
for(int i=2;i<x.size();i++){
int tmp=x[i]-'0';
sum=sum*10+tmp;
}
int su=(sum+1)/2;
string s;cin>>s;
int r=0,p=0;
int cnt=0;
for(int i=0;i<s.size();i++){
if(s[i]=='R')r++;
else p++;
cnt++;
if(r==su){
cout<<"kou!\n";
cout<<cnt;
return ;
}
if(p==su){
cout<<"yukari!\n";
cout<<cnt;
return ;
}
}
cout<<"to be continued.\n";
cout<<s.size();
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
I.
分别求两个数组的最大子序列和与最小子序列和,分别相乘取4种情况的最大值
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
#define inf 0x3f3f3f3f
void solve() {
int n,m;cin>>n>>m;
vector<int>a(n+1),b(m+1);
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
vector<int>ma_a(n+1),ma_b(m+1);
vector<int>mi_a(n+1),mi_b(m+1);
int max_a=-inf,min_a=inf,max_b=-inf,min_b=inf;
for(int i=1;i<=n;i++){
if(i==1){
ma_a[i]=a[i];mi_a[i]=a[i];
}else{
ma_a[i]=max(a[i],a[i]+ma_a[i-1]);
mi_a[i]=min(a[i],a[i]+mi_a[i-1]);
}
max_a=max(max_a,ma_a[i]);
min_a=min(min_a,mi_a[i]);
}
for(int i=1;i<=m;i++){
if(i==1){
ma_b[i]=b[i];mi_b[i]=b[i];
}else{
ma_b[i]=max(b[i],b[i]+ma_b[i-1]);
mi_b[i]=min(b[i],b[i]+mi_b[i-1]);
}
max_b=max(max_b,ma_b[i]);
min_b=min(min_b,mi_b[i]);
}
int ans=max({max_a*max_b,min_a*min_b,max_a*min_b,min_a*max_b});
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}