想了一下还是不发以前做过的水题了,意义也不是很大,现在的话大概只有洛谷黄题以上才会收录了哦~~~
洛谷题解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!!!
仔细看看注释,我相信你可以改出来的哦~~~
嘻嘻新人开博鼓励一下啦!!!