P3611 【[USACO17JAN]Cow Dance Show奶牛舞蹈】

想了一下还是不发以前做过的水题了,意义也不是很大,现在的话大概只有洛谷黄题以上才会收录了哦~~~

喵了个咪的题面~~

洛谷题解dalao不是P党就是优先队列,看的我作为一个新手蒟蒻好慌啊。。。

这题用二分加冒泡(你没有看错,用sort反而会超时)

先用二分决定k的值,然后判断这个k可不可行,然后继续二分,重复刚才操作

具体解释看代码:

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,tmax,t,l,r;
 8 int a[10005],b[10005];//变量就不过多介绍了,大家自己看
 9 int shu(int k){//函数,判断当前k是否可行
10     for(int i=1;i<=k;i++){
11             b[i]=a[i];
12 }//前k个奶牛 sort(b+1,b+1+k);//排序,因为当前数组是无序的,所以用sort
13 
14     for(int i=k+1;i<=n;i++){
15         if(b[k]>tmax)return tmax+1;//如果当前已经超过了,就直接退出循环
16         b[1]+=a[i];//定向思维是减去最小的时间,但未必必须这样做
17         for(int j=2;j<=k;j++){//传说中的冒泡粉墨登场~~~此处用sort真的会超时,不信你们自己去试试
18             if(b[j]>=b[j-1]){//如果已经在合适的位置,就退出循环
19                 break;
20             }
21             int x=b[j];//否则交换
22             b[j]=b[j-1];
23             b[j-1]=x;
24         }
25     }
26     return b[k];//返回最大的时间
27 }
28 int main(){
29     freopen("cowdance.in","r",stdin);
30     freopen("cowdance.out","w",stdout);//这两句话当废话处理,是我在USACO主网站上交的时候加上去的
31     scanf("%d%d",&n,&tmax);
32     for(int i=1;i<=n;i++){
33         scanf("%d",a+i);
34 }//读入 l=1,r=n;//二分的准备活动(- 一二三四,二二三四)
35 
36 while(l<r){//二分开始,在left小于(等于)right的时候执行
37 
38         int mid=(l+r)/2;//取中间值
39         if(shu(mid)>tmax)l=mid+1;//如果当前k不满足要求,增大k的值
40         else r=mid-1;//反之缩小
41     }
42     printf("%d\n",l);//输出
43     return 0;
44 }

嘿嘿~~~ 如果你们Ctrl C+Ctrl V的话,会发现一个很神奇的现象:我的程序不能AC!!!

仔细看看注释,我相信你可以改出来的哦~~~

嘻嘻新人开博鼓励一下啦!!!

猜你喜欢

转载自www.cnblogs.com/hahaha2124652975/p/11123179.html