1875. 【USACO2004 fall bronze】LAUNDRY(laundry.pas/cpp)
(File IO): input:laundry.in output:laundry.out
时间限制: 3000 ms 空间限制: 128001 KB 具体限制
Goto ProblemSet
题目描述
奶牛们用N(1<=N<=1000)根绳子架起了晾衣绳,以便晒它们刚洗完的衣服。用它们不能弯曲的拇指,奶牛们彻底搞砸了这项工作。试想一下四根绳子是这样排列的:
绳子交叉了!这个,当然是无法接受的。
奶牛们想把晾衣绳整理好。它们迟钝的头脑只能处理"交换两根绳"的问题。然而奶牛们的手臂(牛的……也叫手臂)很短,受此限制,它们只能交换相邻两根绳子的端点(在上面或者是下边的固定器上)。以上面的图为例,需要做四次这样的交换才能使绳子变成想下面这样:
帮助奶牛们整理晾衣绳吧。请你找出最小的交换次数,使得这些晾衣绳能够排列整齐。
你将得到有关晾衣绳位置的描述,用整数来表示当前晾衣绳的顺序。这些晾衣绳被标上了1..N的数字。现在可以告诉你的是,这些晾衣绳在上面和下面各N个连接插槽上的出现顺序。
输入
第1行:一个整数N
第2..N+1行:
每一行有两个隔开的整数(均在1..N范围内)。第一个整数表示在上插槽上连接的绳子的ID,第二个整数表示在下插槽上连接的绳子的ID。第二行的两个整数就分别表示了1号上插槽和1号下插槽上连接的绳子;第三行则分别描述了2号上插槽和下插槽上连接的绳子……以此类推。
输出
第1行:一个整数,指出可以把晾衣绳全都弄直的最小交换次数
样例输入
4
4 1
2 3
1 4
3 2
样例输出
4
数据范围限制
1<=N<=1000
提示
样例说明
把3号绳上面的端点和它左边的交换,再和左边的交换一次。4号绳也做同样的工作。
正解:最先要把靠边边的给搞直 (就是冒泡排序啦)
#include< iostream>
#include< cstdio>
using namespace std;
long long int x=1,n,over[1100],low[1100],w,v,ans=0;
void huan(int i)
{
long long u=over[x];
for(int j=i;j>x;j--)
{
over[j]=over[j-1];
ans++;
}
over[x]=u;
}
int pd()
{
for(int i=1;i<=n;i++)
{
if(over[i]!=low[i])
{
return 0;
break;
}
}
return 1;
}
int main()
{
//freopen("laundry.in","r",stdin);
//freopen("laundry.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&over[i],&low[i]);
}
for(int i=1;i<n;i++)
{
v=low[i];
if(low[i]!=over[i])
for(int j=x;j<=n;j++)
{
if(over[j]==v)
{
w=j;
huan(w);
break;
}
}
x++;
if(pd()==1)
break;
}
cout<<ans;
system("pause");
return 0;
}
1876. 【USACO2004 fall bronze】罗密欧与朱丽叶的约会(meet.pas/cpp)
(File IO): input:meet.in output:meet.out
时间限制: 3000 ms 空间限制: 128000 KB 具体限制
Goto ProblemSet
题目描述
农场主约翰养了两群有世仇的牛,它们被称为蒙塔戈斯家族和卡普鲁特家族。蒙塔戈斯家族的成员,罗密欧,爱上了美丽的朱丽叶,但后者正好是卡普鲁特家族的成员。罗密欧希望与朱丽叶约会,但不希望卡普鲁特家族的其他成员发现(否则会有可怕的事情发生!)
罗密欧和朱丽叶希望在牧场栅栏边一块尽可能大的区域中相见,这样他们可以边散步边聊天。然而,这块区域中不应该有太多的卡普鲁特家族成员,否则,他们俩被发现的机会就会大得多。罗密欧发现在整个牧场栅栏边有P块草坪呈直线排列(1<=P<=1000),在这些草坪上总共有N位卡普鲁特家族的成员在吃草(1<=N<=1000)。每个卡普鲁特家族的成员在一些相邻的草坪上吃草。现在,罗密欧求助于聪明的你,希望你能找出一个最大的范围(指一些相邻的草坪),在这个范围的草坪中,至多有C(1<=C<=1000〉位卡普鲁特家族的成员在吃草。
输入
第一行,包含三个整数:N,P,C
第二至N+1行:每行包括一个整数X(1<=X<=P-1),代表一个卡普鲁特家族成员在栅栏边的第X和X+1块草坪之间吃草,多个卡普鲁特家族成员可以在同一块草坪内一起吃草。
输出
只有一行:一个整数,代表一个最大的草坪范围(指这些草坪的块数),在这个范围内最多只有C个卡普鲁特家族的成员在吃草。
样例输入
2 6 1
2
3
(解释:栅栏边的草坪分为六块:1 2 3 4 5和6。有两个卡普鲁特家族成员,一个在第二和第三块草坪上吃草,一个在第三和第四块草坪上吃草)
样例输出
3
(解释:在第四块至至第六块草坪间只有一个卡普鲁特家族的成员在吃草)
数据范围限制
1<=P<=1000
1<=N<=1000
1<=C<=1000
正解:求前缀和就好,注意一下一头牛是可以在两块草坪上的
#include< iostream>
#include< cstdio>
#include< cstring>
using namespace std;
long long int n,p,c,a[1200],x[1010],f[1010],z=1,ans=0,num=0,v;
int main()
{
memset(x,0,sizeof(x));
memset(a,0,sizeof(a));
//freopen("meet.in","r",stdin);
//freopen("meet.out","w",stdout);
cin>>n>>p>>c;
for(int i=1;i<=n;i++)
{
scanf("%lld",&v);
x[v]++;
a[v]+=1;
a[v+1]+=1;
} for(int i=1;i<=p;i++) { f[i]=f[i-1]+(a[i]-x[i]);//求前缀和 } for(long long int i=1;i<=p;i++) { for(long long int j=1;j<i;j++) { if(f[i]-f[j]<=c) { ans=max(ans,i-j); } } } cout<<ans; system("pause"); return 0;
}
题目
最新推荐文章于 2023-03-11 14:23:16 发布