Benelux Algorithm Programming Contest 2019

1.J Jazz it Up!
此题题目要求:
n*m因子中不能含有平方形式,因为题目中已经说明n是一个无平方因子的数,
那么只要m是无平方因子的数,并且n和m没有共同的因子即可。
根据算术基本定理,n可以分解成若干个质数的积,所以m就直接可以是非n的因子的一个质数。

#include<bits/stdc++.h>
using namespace std;
vector<int>p;
int isp(int n)
{
int l=sqrt(n);
if(n==2||n==1)return 1;
for(int i=2;i<=l;i++)
{
if(n%i==0)return 0;
}
return 1;

}
int a[100005];


int find(int n)
{
int l=p.size();
if(l==0)return 0;
for(int i=0;i<l;i++)
{
if(p[i]==n)return 1;
}
return 0;
}
int main()
{
for(int i=2;i<100002;i++)
{
a[i]=isp(i);
}
int n;
cin>>n;
int l=sqrt(n);
for(int i=2;i<=l;i++)
{
if(n%i==0){
p.push_back(i);
p.push_back(n/i);
}
}
for(int i=2;i<n;i++)
{
if(a[i]==1&&find(i)==0)
{
cout<<i;
break;
}
}
 }

补题:

1.F Find my Family

题目意思:找出存在中间的数比左边的数小,右边的数比左边的数大,如果对于暴力求法,在 n
次情况下必定超时

#include<iostream>
#include<algorithm>
#include<cmath>
#define N 300004
#define W 1007
using namespace std;
long long a[N];
int main()
{
int k,c[W],m=1,s,count=0;
cin>>k;
while(k--){
int n,i,j,q,x=1;
cin>>n;
count++;
for(i=1;i<=n;i++){
cin>>a[i];
}
for(i=1;i<=n-2;i++){
for(j=i+1;j<=n-1;j++){
if(a[i]>a[j]){
for(q=j+1;q<=n;q++){
if(a[i]<a[q]){
c[m++]=count;
x=0;
// cout<<count<<":"<<endl;
break;
}
else continue;
}
break;
}
}
for(int r=i+1;;r++){
if(a[i]>a[r])
i++;
else break;
}
if(x==0)break;
}
}
cout<<m-1<<endl;
for(s=1;s<m;s++){
cout<<c[s]<<endl;
}
}

//以上这就是超时代码,比赛时想到的

别人的:需要两个客观意义上的指针。首先解决右边的数,那么我们把第 i 个数以后
最大的数找出,就可以解决右边数的最大值,剩下的就是左边的数,我们可以同过 set 和二分来查找出
比当前 数恰好大一点的数, 若有,再用此数 和右边的最大数相比即可。

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5+7,INF = 0x3f3f3f3f;
int k,n,Max;
int a[N],max_bh[N];
vector<int> ans;
int main(){
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d",&n);
for(int j=1;j<=n;j++)
scanf("%d",&a[j]);
for(int j=n;j>0;j--)
if(a[j]>Max){
max_bh[j]=a[j];
Max=a[j];}
else max_bh[j] = Max;
set<int> st;
Max = 0;
for(int j=1;j <= n;++j){
if(!st.size() || a[j] == max_bh[j])
{ st.insert(a[j]);
continue; }
auto pos = st.upper_bound(a[j]);
if(pos != st.end()){
if(*pos < max_bh[j]){
ans.push_back(i); break; } }
st.insert(a[j]); } }
printf("%d\n",ans.size());
for(int i=0;i < ans.size(); ++i)
printf("%d\n",ans[i]);
return 0; }

猜你喜欢

转载自www.cnblogs.com/1324a/p/12564949.html