华师一附中OI组
标题:
NOIP2004提高组题3 合唱队形
[打印本页]
作者:
admin
时间:
2014-10-21 16:46
标题:
NOIP2004提高组题3 合唱队形
三、合唱队形
(chorus.pas
/dpr
/
c
/
cpp)
【问题描述】
N
位同学站成一排,音
乐
老师要请其中的
(N-K)
位同学出列,使得剩下的
K
位同学排成合唱队形。
合唱队形是指这样的一种队形:设
K
位同学从左到右依次编号为
1
,
2…
,
K
,他们的身高分别为
T1
,
T2
,
…
,
TK
,
则他们的身高满足
T1<...<Ti>Ti+1>…>TK(1<=i<=K)
。
你的任务是,已知所有
N
位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入文件】
输入文件
chorus.in
的第一行是一个整数
N(2<=N<=100)
,表示同学的总数。第一行有
n
个整数,用空格分隔,第
i
个整数
Ti(130<=Ti<=230)
是第
i
位同学的身高
(
厘米
)
。
【输出文件】
输出文件
chorus.out
包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
【数据规模】
对于
50
%的数据,保证有
n<=20
;
对于全部的数据,保证有
n<=100
。
作者:
Settwarl
时间:
2014-10-28 20:18
效率不太高的方法:
#include<iostream>
#include<cstdio>
using namespace std;
int n,t[101],a[101]={0},k=0,kf=0;
bool down(int);
int next(int i)
{
int ii=i;
do
{
i++;
if(i>n)return ii;
}while(a[i]==0);
return i;
}
void save()
{
kf=kf<k?k:kf;
}
void mysearch(int p)
{
if((p>n)&&(down(p)))
{
save();
}
else for(int i=p;i<=n;i++)
{
if(a[i]==0)
{
k++;
a[i]=1;
if(down(i))
mysearch(p+1);
a[i]=0;
k--;
if(down(i))
mysearch(p+1);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>t[i];
mysearch(1);
cout<<n-kf;
return 0;
}
bool down(int p)
{
bool b=true;
int mx=1,i;
while((mx<p)&&(t[mx]<t[next(mx)]))mx++;
for(i=mx;i<p;i++)
if((a[i]==1)&&(t[i]<=t[next(i)])&&(i!=next(i)))b=false;
return b;
}
复制代码
作者:
hr567
时间:
2014-10-28 21:47
Settwarl 发表于 2014-10-28 20:18
效率不太高的方法:
膜拜大神,我完全不知道怎么写
作者:
/wjr/
时间:
2014-11-4 21:42
这是我的做法:n个最长上升子序列和最长下降子序列。。。并上并行读取。。。
#include<iostream>
using namespace std;
int n,a[10010],ans1[10010],ans2[10010],ans[10010],k=9999999;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
for(int j=1;j<=i;j++)
if(a[i]>a[j])ans1[i]=max(ans1[i],ans1[j]+1);
}
for(int i=n;i>=1;i--)
for(int j=n;j>=i;j--)
if(a[i]>a[j])ans2[i]=max(ans2[i],ans2[j]+1);
for(int i=1;i<=n;i++)
{
ans[i]=ans1[i]+ans2[i];
k=min(k,n-ans[i]);
}
if(k!=9999999)cout<<k-1;
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-9-30 18:56
#include<iostream>
using namespace std;
int n,a[110],f1[110],max1,f2[110],max2,ans;
int i,j,k;
int main()
{
cin>>n;
for(i=1;i<=n;i++)cin>>a[i];
for(i=1;i<=n;i++)
{
f1[i]=1;
f2[i]=1;
}
for(i=2;i<=n;i++)
for(j=1;j<=i-1;j++)
if(a[i]>a[j]) f1[i]=max(f1[i],f1[j]+1);
for(i=n-1;i>=1;i--)
for(j=n;j>=i+1;j--)
if(a[i]>a[j]) f2[i]=max(f2[i],f2[j]+1);
for(i=1;i<=n;i++)
ans=max(ans,f1[i]+f2[i]-1);
///cout<<ans<<endl;
cout<<(n-ans);
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2