题解:yi (Standard IO)
题解
yi (Standard IO)
Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits
一道很水的题目,题目很水,数据更水,long long都不用开就过了。
读入数据的时候“燃料数”小于k*2的飞船直接不计入数组,读入完毕后从大到小排序,使我们枚举的时候满足最优解。然后定义一个h现可以载的人数,ans为答案,ans的初始值为-1。h+=f[1.....in-2in-1in],这里的n为减去不满足条件的飞船后的飞船总数。如果h>m,令ans=i,并且跳出循环,输出答案。如果没有跳出循环,那么无解,用了所有飞船也无法载完所有人,输出ans,因为ans没有改变值为-1。
附上代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 int n,m,k,h,ans=-1;
6 int a[100005];
7 void quick(int,int);
8 int main()
9 {
10 scanf("%d%d%d",&n,&m,&k);
11 k*=2;
12 for(int i=1;i<=n;i++)
13 {
14 int c,d;
15 scanf("%d%d",&c,&d);
16 if(d>=k) a[i]=c;
17 else
18 {
19 i--;
20 n--;
21 continue;
22 }
23 }
24 quick(1,n);
25 for(int i=1;i<=n;i++)
26 {
27 h+=a[i];
28 if(h>=m)
29 {
30 ans=i;
31 break;
32 }
33 }
34 printf("%d",ans);
35 return 0;
36 }
37 void quick(int l,int r)
38 {
39 int i=l;
40 int j=r;
41 int mid=a[(i+j)/2];
42 do
43 {
44 while(a[i]>mid) i++;
45 while(a[j]<mid) j--;
46 if(i<=j)
47 {
48 swap(a[i],a[j]);
49 i++;j--;
50 }
51 }while(i<=j);
52 if(l<=j) quick(l,j);
53 if(i<=r) quick(i,r);
54 }
by:ルオ・テンイの锦依卫
未经作者允许,禁止转载!