5937. 斬殺計劃
阿新 • • 發佈:2018-11-01
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #define N 5000007 6 using namespace std; 7 int n,m; 8 int a[N],list[N],tot; 9 10 inline int read(){ 11 int s=0; 12 char ch=getchar(); 13 for(;ch<'0'||ch>'9';ch=getchar()); 14 for(;ch>='0'&&ch<='9';s=s*10+ch-'0',ch=getchar()); 15 return s; 16 } 17 18 int main(){ 19 freopen("zhanshajihua.in","r",stdin); 20 freopen("zhanshajihua.out","w",stdout); 21 n=read(); 22 m=read(); 23 for(register int i=1;i<=n;++i) a[i]=read(); 24 sort(1+a,1+a+n); 25 if (m==0){ 26 printf("0 0"); 27 return 0; 28 } 29 register int sum=0,ans=0,attack=0; 30 for(register int i=1;i<=n;){ 31 while(a[i]-sum*3>0) ++sum; 32 --sum; 33 int j=i; 34 while(j<=n){ 35 if (a[j]-sum*3>3) break; 36 while(a[j]-sum*3==0&&j<=n) j++; 37 if (a[j]-sum*3<3) ++ans,attack+=a[j]-sum*3,list[++tot]=a[j]-sum*3; 38 else ans+=4,attack+=3,list[++tot]=3; 39 ++j; 40 } 41 if (attack>=m) break; 42 i=j; 43 } 44 ans+=sum; 45 sort(list+1,list+tot+1); 46 while(tot&&list[tot]==3){ 47 if (attack-list[tot]>=m){ 48 if (list[tot]==3) attack-=3,ans-=4; 49 else attack-=list[tot],--ans; 50 } 51 if (attack==m) break; 52 tot--; 53 } 54 int j=1; 55 while(j<=tot){ 56 if (attack-list[j]>=m){ 57 if (list[j]==3) attack-=3,ans-=4; 58 else attack-=list[j],--ans; 59 } 60 if (attack==m) break; 61 j++; 62 } 63 if (attack>=m) printf("%d %d",sum,ans); 64 else printf("-1"); 65 }View Code