time limit per test2 seconds

memory limit per test256 megabytes

inputstandard input

outputstandard output

Do you know the story about the three musketeers? Anyway, you must help them now.

Richelimakieu is a cardinal in the city of Bearis. He found three brave warriors and called them the three musketeers. Athos has strength a, Borthos strength b, and Caramis has strength c.

The year 2015 is almost over and there are still n criminals to be defeated. The i-th criminal has strength ti. It’s hard to defeat strong criminals — maybe musketeers will have to fight together to achieve it.

Richelimakieu will coordinate musketeers’ actions. In each hour each musketeer can either do nothing or be assigned to one criminal. Two or three musketeers can be assigned to the same criminal and then their strengths are summed up. A criminal can be defeated in exactly one hour (also if two or three musketeers fight him). Richelimakieu can’t allow the situation where a criminal has strength bigger than the sum of strengths of musketeers fighting him — a criminal would win then!

In other words, there are three ways to defeat a criminal.

A musketeer of the strength x in one hour can defeat a criminal of the strength not greater than x. So, for example Athos in one hour can defeat criminal i only if ti ≤ a.

Two musketeers can fight together and in one hour defeat a criminal of the strength not greater than the sum of strengths of these two musketeers. So, for example Athos and Caramis in one hour can defeat criminal i only if ti ≤ a + c. Note that the third remaining musketeer can either do nothing or fight some other criminal.

Similarly, all three musketeers can fight together and in one hour defeat a criminal of the strength not greater than the sum of musketeers’ strengths, i.e. ti ≤ a + b + c.

Richelimakieu doesn’t want musketeers to fight during the New Year’s Eve. Thus, he must coordinate their actions in order to minimize the number of hours till all criminals will be defeated.

Find the minimum number of hours to defeat all criminals. If musketeers can’t defeat them all then print “-1” (without the quotes) instead.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 200 000) — the number of criminals.

The second line contains three integers a, b and c (1 ≤ a, b, c ≤ 108) — strengths of musketeers.

The third line contains n integers t1, t2, …, tn (1 ≤ ti ≤ 108) — strengths of criminals.

Output

Print one line with the answer.

If it’s impossible to defeat all criminals, print “-1” (without the quotes). Otherwise, print the minimum number of hours the three musketeers will spend on defeating all criminals.

Examples

input

5

10 20 30

1 1 1 1 50

output

2

input

5

10 20 30

1 1 1 1 51

output

3

input

7

30 20 10

34 19 50 33 88 15 20

output

-1

input

6

10 5 10

10 9 5 25 20 5

output

3

Note

In the first sample Athos has strength 10, Borthos 20, and Caramis 30. They can defeat all criminals in two hours:

Borthos and Caramis should together fight a criminal with strength 50. In the same hour Athos can fight one of four criminals with strength 1.

There are three criminals left, each with strength 1. Each musketeer can fight one criminal in the second hour.

In the second sample all three musketeers must together fight a criminal with strength 51. It takes one hour. In the second hour they can fight separately, each with one criminal. In the third hour one criminal is left and any of musketeers can fight him.

【题解】



贪心;

用平衡树来找小于等于某个能力值的抵抗力最大的敌人,并删掉它;

用代码来讲;(以一小时为单位,查看一小时,这3个人能做些什么);

//a[1]<a[2]<a[3]
//work(a)会删去平衡树中小于等于a且最大的数字;
int mx = get_max(root);
if (mx<=a[1])//如果抵抗力最大的敌人都比能力值最小的那个人小。则三个人每次都能打3个敌人
{
ans--;
ans +=(n+2)/3;
break;
}
else
if (mx<=a[2])//如果mx<a[1]<=a[2];
{//则分别去打就好;
work(a[1]);
work(a[2]);
work(a[3]);
}
else
if (mx <=a[3])//如果a[1]<a[2]<mx<=a[3]
{//如果a[1]和a[2]每个人都能打一个敌人(两个),则让他们俩分别打;如果两人总共只能打一只或不能打,尝试a[1]+a[2]合起来打一只会更好;
qianqu = 0;
ask_before(root,a[1]);
bool flag = 1;
if (qianqu!=0)
{
int temp1 = qianqu;
de_lete(root,qianqu);
qianqu = 0;
ask_before(root,a[2]);
if (qianqu!=0)
{
de_lete(root,qianqu);
n-=2;
work(a[3]);
}
else
{
insert(root,temp1);
flag = 0;
}
}
else
flag = 0;
if (!flag)
{
work(a[1]+a[2]);
work(a[3]);
}
}
else
if (mx<=a[1]+a[2])//小于最小的两个,就a[1]+a[2]合体然后a[3]分别打;
{
work(a[1]+a[2]);
work(a[3]);
}
else
if (mx <= a[1]+a[3])//同理
{
work(a[1]+a[3]);
work(a[2]);
}
else
if (mx <= a[2]+a[3])
{
work(a[2]+a[3]);
work(a[1]);
}
else//想等就全部合起来打;
work(a[1]+a[2]+a[3]);

完整代码↓↓↓

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <string>
#define lson L,m,rt<<1
#define rson m+1,R,rt<<1|1
#define LL long long using namespace std; const int MAXN = 6000990;
const int dx[5] = {0,1,-1,0,0};
const int dy[5] = {0,0,0,-1,1};
const double pi = acos(-1.0); int n,root=0,l[MAXN],r[MAXN],key[MAXN],size[MAXN],totn = 0,cf[MAXN],a[4],qianqu;
int t[MAXN]; int get_max(int t)
{
int temp = r[t];
while (temp)
{
t = r[t];
temp = r[t];
}
return key[t];
} void right_rotation(int &t)
{
int k = l[t];
l[t] = r[k];
r[k] = t;
size[k] = size[t];
size[t] = size[l[t]]+size[r[t]]+1;
t = k;
} void left_rotation(int &t)
{
int k = r[t];
r[t] = l[k];
l[k] = t;
size[k] = size[t];
size[t] = size[r[t]]+size[l[t]]+1;
t = k;
} void maintain(int &t,bool flag)
{
if (flag)
{
if (size[l[l[t]]] > size[r[t]])
right_rotation(t);
else
if (size[r[l[t]]] > size[r[t]])
{
left_rotation(l[t]);
right_rotation(t);
}
else
return;//如果都不是的话就结束递归
}
else
{
if (size[r[r[t]]] > size[l[t]])
{
left_rotation(t);
}
else
if (size[l[r[t]]] > size[l[t]])
{
right_rotation(r[t]);
left_rotation(t);
}
else
return;
}
maintain(l[t],true);
maintain(r[t],false);
maintain(t,true);
maintain(t,false);
} void insert(int &t,int data)
{
if (t==0)
{
t=++totn;
l[t] = r[t] = 0;
size[t] = 1;
key[t] = data;
}
else
{
size[t]++;
if (data<key[t])
insert(l[t],data);
else
insert(r[t],data);
maintain(t,data<key[t]);
}
} void ask_before(int t, int x)
{//询问前趋是啥
if (!t)
return;
if (key[t] <= x)
{
qianqu = max(qianqu, key[t]);
ask_before(r[t], x);
}
else
if (x < key[t])
ask_before(l[t], x);
} void de_lete(int &t,int data) //这是删除平衡树中某个节点的过程;
{
size[t]--;//因为这个节点肯定在以t为根的树下面。所以删除后,它的大小会递减。
if (key[t] == data)//如果找到了要删除的元素。
{
if (l[t] ==0 && r[t] == 0)//如果它没有左子树或右子树
t = 0;//那么就直接把这个节点置空
else
if (l[t] == 0 && r[t]!=0)//如果左子树为空,右子树不为空
t = r[t];//就把这个节点去掉,用右子树来接在下面。
else
if (l[t] != 0 && r[t] == 0)//如果左子树不为空,右子树为空
t = l[t];//则直接把这个节点去掉,把左子树接在下面。
else
if (l[t]!=0 && r[t]!=0)
{
int temp = r[t];
while (l[temp]) temp = l[temp];
key[t] = key[temp];
de_lete(r[t],key[temp]);
}
}
else
if (data<key[t])
de_lete(l[t],data);
else
de_lete(r[t],data);
} void work(int x)
{
if (!root)
return;
qianqu = 0;
ask_before(root,x);
if (qianqu!=0)
{
de_lete(root,qianqu);
n--;
}
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
//printf("%d\n",6*sizeof(size)/1024/1024);
// return 0;
scanf("%d",&n);
for (int i = 1;i <= 3;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+3);
for (int i = 1;i <= n;i++)
scanf("%d",&t[i]),insert(root,t[i]);
if (get_max(root)>a[1]+a[2]+a[3])
{
puts("-1");
return 0;
}
int ans = 0;
while (root && n)
{
ans++;
int mx = get_max(root);
if (mx<=a[1])
{
ans--;
ans +=(n+2)/3;
break;
}
else
if (mx<=a[2])
{
work(a[1]);
work(a[2]);
work(a[3]);
}
else
if (mx <=a[3])
{
qianqu = 0;
ask_before(root,a[1]);
bool flag = 1;
if (qianqu!=0)
{
int temp1 = qianqu;
de_lete(root,qianqu);
qianqu = 0;
ask_before(root,a[2]);
if (qianqu!=0)
{
de_lete(root,qianqu);
n-=2;
work(a[3]);
}
else
{
insert(root,temp1);
flag = 0;
}
}
else
flag = 0;
if (!flag)
{
work(a[1]+a[2]);
work(a[3]);
}
}
else
if (mx<=a[1]+a[2])
{
work(a[1]+a[2]);
work(a[3]);
}
else
if (mx <= a[1]+a[3])
{
work(a[1]+a[3]);
work(a[2]);
}
else
if (mx <= a[2]+a[3])
{
work(a[2]+a[3]);
work(a[1]);
}
else
work(a[1]+a[2]+a[3]);
}
printf("%d\n",ans);
return 0;
}

【14.94%】【codeforces 611E】New Year and Three Musketeers的更多相关文章

  1. 【 BowWow and the Timetable CodeForces - 1204A 】【思维】

    题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...

  2. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  3. 【77.78%】【codeforces 625C】K-special Tables

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  4. 【codeforces 754D】Fedor and coupons

    time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. 【codeforces 760A】Petr and a calendar

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. 【codeforces 750E】New Year and Old Subsequence

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. 【22.73%】【codeforces 606D】Lazy Student

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. 【codeforces 762B】USB vs. PS/2

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  9. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

随机推荐

  1. LoadRunner--HTML与URL录制方式区别

    Recording录制选项 这里提供了两个大类的录制方式: 1. HTML-based script基于HTML的脚本 这种方式录制出来的脚本是基于HTML基础的,为每个用户操作生成单独的步骤,这种脚 ...

  2. netty epoll调用示例

    1.服务器端 import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.PooledByteBufAllocator; imp ...

  3. 6.2、Android硬件访问服务编写系统代码

    1.实现接口文件给App使用,接口文件是应用程序查询获得服务时获得 使用AIDL(Android接口定义语言)来实现ILedService.java接口 定义ILedService.aidl inte ...

  4. ORACLE表空间的备份与恢复策略

    转自原文如何进行ORACLE表空间的备份与恢复? 1.切换服务器归档模式,如果已经是归档模式可跳过此步: %sqlplus /nolog (启动sqlplus) SQL> conn / as s ...

  5. Genymotion加入模拟器时报“Unable to create virtual device,Server returned HTTP status code 0”

    今天也遇到这个问题,算是对这个文章的一点补充 打开图中这个文件 C:\Users\xxx\AppData\Local\Genymobile 搜索 [downloadFile] 找到这个一串URL ht ...

  6. 从Set里面取出有序的记录

    Set里面的记录是无序的.假设想使用Set,然后又想里面的记录是有序的,就能够使用TreeSet.而不是HashSet.在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,T ...

  7. <p><img src="http://img.blog.csdn.net/20150823142545135?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>

    /* 实现功能:用顺序表实现栈的各种操作 编译环境:Windows 64b,vc6.0 日期: 2015/7/20 作者:wtt561111 */ #define stack_max_num 10 # ...

  8. python链表的实现,有注释

    class Node():                   #node实现,每个node分为两部分:一部分含有链表元素,成数据域;另一部分为指针,指向下一个  __slots__=['_item' ...

  9. GitHub项目协作基本步骤 分类: C_OHTERS 2013-09-23 21:31 690人阅读 评论(0) 收藏

    1.查找某个项目,然后Fork 2.打开GitHub For Windows,发现刚才Fork的项目 3.对着项目点击Clone,将之复制至本地 4.使用Eclipse等进行开发,如新增一个文件 5. ...

  10. php正则表达式函数

    $zz = '/^\d{1,}$/'; //上面的这种方式没问题,还有一种方式经测试也没问题,如下 echo preg_match($zz, "123423423423");//比 ...