题目

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; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值