最后队友猜了一发结论是最长上升子序列,过了。。。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
#define sc(a) scanf("%d",&a)
const int mod=1e9+9;
const int N=501;
int n,a[N],dp[N],s[N];
int ans=1e9;
int main()
{
sc(n);
for(int i=1;i<=n;i++)sc(a[i]);
for(int k=1;k<=n;k++)
{
int cnt=0;
for(int i=k;i<=n;i++)
s[++cnt]=a[i];
for(int i=1;i<k;i++)s[++cnt]=a[i];
cnt=1;
dp[1]=s[1];
for(int i=2;i<=n;i++)
{
if(s[i]>dp[cnt])
dp[++cnt]=s[i];
else {
int l=lower_bound(dp+1,dp+1+cnt,s[i])-dp;
dp[l]=s[i];
}
}
//cout<<cnt<<endl;
ans=min(ans,n-cnt);
}cout<<ans;
return 0;
}
找环,将所有环的大小求lcm,我们用到了大数乘法,最后还判了前导零(没判的时候wa了),结果题解说不用取模???
代码
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int mod=1e9+9;
const int maxn=1e5+10;
ll s[maxn],f,x;
int n,a[maxn],m[maxn],cnt=1;
ll gcd(ll c,ll b)
{
if(b==0)
return c;
else if(c%b==0)
return b;
else
return gcd(b,c%b);
}
void chenfa() //s*=f
{
for(int i=0;i<cnt;i++)
s[i]=s[i]*f;
for(int i=0;i<cnt;i++)
s[i+1]+=s[i]/10,s[i]%=10;
while(s[cnt]>=10)
s[cnt+1]+=s[cnt]/10,s[cnt]%=10,cnt++;
if(s[cnt]>0)
cnt++;
}
void chufa() //s/=x
{
ll sum=0;
int b[cnt+5],k=0,c=0;
for(int i=cnt-1;i>=0;i--)
{
sum*=10;
sum+=s[i];
b[k++]=sum/x;
sum%=x;
s[i]=0;
}
while(b[c]==0&&c<k)
c++;
cnt=0;
for(int i=c;i<k;i++)
b[cnt++]=b[i];
for(int i=0;i<cnt;i++)
s[cnt-1-i]=b[i];
}
ll quyu() //return s%f
{
ll sum=0;
for(int i=cnt-1;i>=0;i--)
{
sum*=10;
sum+=s[i];
sum%=f;
}
return sum;
}
int main()
{
s[0]=1;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
a[x]=i;
}
for(int i=1;i<=n;i++)
{
if(m[i])
continue;
m[i]++;
x=a[i];
f=1;
while(x!=i)
m[x]++,x=a[x],f++;
x=gcd(f,quyu());
//cout<<2;
chenfa(); //s*=f
chufa(); //s/=x
}
//cout<<cnt<<endl;
x=min(n,cnt)-1;
while(s[x]==0&&x>=0)
x--;
for(int i=x;i>=0;i--)
printf("%lld",s[i]);
if(x<0)
cout<<0;
return 0;
}
F.DPS
签到
代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int mod=1e9+9;
const int maxn=1e5+10;
int t,n,ans,m;
int a[maxn],vis[maxn],s;
int main()
{
cin>>n;
s=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s=max(s,a[i]);
}
for(int i=1;i<=n;i++)
{
m=(int)ceil(1ll*50*a[i]*1.0/s);
cout<<'+';
for(int j=1;j<=m;j++)
{
cout<<'-';
}
cout<<'+'<<endl;
cout<<'|';
for(int j=1;j<m;j++)
{
cout<<' ';
}
if(m!=0)
{
if(s==a[i])
cout<<'*';
else
cout<<" ";
}
cout<<'|'<<a[i]<<endl;
cout<<'+';
for(int j=1;j<=m;j++)
{
cout<<'-';
}
cout<<'+'<<endl;
}
return 0;
}
结论题,试出来的。。。答案是2/3.。。。