cf I. Intergalactic Bidding ( 大数 +贪心)

http://codeforces.com/gym/101933/problem/I

I. Intergalactic Bidding

time limit per test

2.0 s

memory limit per test

256 MB

input

standard input

output

standard output

Today the Intergalactic Council of Pebble Coins (ICPC) conducted an intergalactic auction of the Neutronium Chaos Pebble Coin (NCPC). This coin, which was forged in the Ancient Coin Machine (ACM), is rumored to be the key to ruling the universe.

Due to the extremely competitive nature of the auction, as well as the odd mechanics of the intergalactic currency used (far too advanced for mere mortals to understand), the auction was conducted with the following rules:

  1. only one participant was allowed to make a bid at a time,
  2. each participant was only allowed to make one bid, and
  3. a participant making a bid had to bid at least twice the amount of the highest bid at the time.

The first participant making a bid was allowed to make a bid of any positive amount.

After the auction there were a lot of sore losers – understandably, having just lost their chance at world domination. To make the losers feel a little better and prevent possible rioting, the ICPC has decided to hold a lottery for the participants. The winners of the lottery are determined as follows. The ICPC picks a random number ss. A group of participants is called winning if the sum of their bets from the auction is equal to ss. A participant wins the lottery and receives a prize – a shiny Pebble Coin – if they belong to any winning group of participants.

Given the names of the participants, the bets that they made, and the random number ss chosen by the ICPC, help them determine which participants won the lottery.

Input

The first line of input contains two integers nn and ss, where 1≤n≤10001≤n≤1000 is the number of participants, and 1≤s<1010001≤s<101000 is the random number chosen by the ICPC.

Then follow nn lines describing the participants. Each line contains a string tt and an integer bb, where tt is the name of a participant, and 1≤b<1010001≤b<101000 is the amount of his bet. The name of each participant is unique and consists of between 11 and 2020 letters from the English alphabet.

Output

Output an integer kk denoting the number of participants that won the lottery. Then output kk lines containing the names of the participants that won the lottery, one per line, in any order.

Examples

input

Copy

5 63
Vader 3
Voldemort 7
BorgQueen 20
Terminator 40
Megatron 101

output

Copy

3
Terminator
BorgQueen
Vader

input

Copy

4 1112
Blorg 10
Glorg 1000
Klorg 1
Zlorg 100

output

Copy

0

把所有的数从大到小排序,因为每一个数是前一个的数的两倍,所以从大到小要一直加

如果没有大于等于随机数,就永远不会等于随机数了,因为数是前面的二分之一

套一个大整数模板

#include<bits/stdc++.h>
#define MAXN 9999
#define M 1000//
#define DLEN 4
using namespace std;
class Bint
{
	private:
		int a[M];
		int len;
	public:
		Bint()//Construction function
		{
			len=1;
			memset(a,0,sizeof(a));
		}
		Bint(const int);
		Bint(const char*);
		Bint(const Bint &);
		Bint(const std::string s);
 
		friend istream & operator>>(istream&,  Bint&);//Overloaded IO stream
		friend ostream & operator<<(ostream&,  Bint&);
 
		Bint &operator=(const Bint &);//Overloaded operator
		Bint  operator+(const Bint &) const;
		Bint  operator-(const Bint &) const;
		Bint  operator*(const Bint &) const;
		Bint  operator/(const int  &) const;
		Bint  operator^(const int  &) const;
		int   operator%(const int  &) const;
 
		bool operator<(const Bint& b)const
		{
			if(len!=b.len)return len<b.len;
			for (int i=len-1; i>=0; --i)if(a[i]!=b.a[i])return a[i]<b.a[i];
			return false;
		}
		bool operator>(const Bint& b)const
		{
			return b<*this;
		}
		bool operator<=(const Bint& b)const
		{
			return !(b<*this);
		}
		bool operator>=(const Bint& b)const
		{
			return !(*this<b);
		}
		bool operator!=(const Bint& b)const
		{
			return b<*this||*this<b;
		}
		bool operator==(const Bint& b)const
		{
			return !(b<*this)&&!(*this<b);
		}
		void print()//output
		{
			printf("%d",a[len-1]);
			for(int i=len-2; i>=0; --i)printf("%04d",a[i]);
			putchar('\n');
		};
};
Bint::Bint(const int b)
{
	int c,d=b;
	len=0;
	memset(a,0,sizeof(a));
	while(d>MAXN)
	{
		c=d-(d/(MAXN+1))*(MAXN+1);
		d=d/(MAXN+1);
		a[len++]=c;
	}
	a[len++]=d;
}
Bint::Bint(const char*s)
{
	int t,k,index,l,i;
	memset(a,0,sizeof(a));
	l=strlen(s);
	len=l/DLEN;
	if(l%DLEN) ++len;
	index=0;
	for(i=l-1; i>=0; i-=DLEN)
	{
		t=0;
		k=i-DLEN+1;
		if(k<0)k=0;
		for(int j=k; j<=i; j++)t=t*10+s[j]-'0';
		a[index++]=t;
	}
}
Bint::Bint(const Bint & T):len(T.len) //拷贝构造函数
{
	memset(a,0,sizeof(a));
	for(int i=0; i<len; ++i) a[i]=T.a[i];
}
Bint::Bint(const std::string s)
{
	int t,k,index,l,i;
	memset(a,0,sizeof(a));
	l=s.length();
	len=l/DLEN;
	if(l%DLEN) ++len;
	index=0;
	for(i=l-1; i>=0; i-=DLEN)
	{
		t=0;
		k=i-DLEN+1;
		if(k<0)k=0;
		for(int j=k; j<=i; j++)t=t*10+s[j]-'0';
		a[index++]=t;
	}
}
Bint & Bint::operator=(const Bint & n) //重载赋值运算符,大数之间进行赋值运算
{
	len=n.len;
	memset(a,0,sizeof(a));
	for(int i=0; i<len; ++i)a[i]=n.a[i];
	return *this;
}
istream& operator>>(istream & in,Bint & b)
{
	char ch[M*4];
	in>>ch;
	int l=strlen(ch),count=0,sum=0,i=-1;
	for(int i=l-1; i>=0;)
	{
		sum=0;
		int t=1;
		for(int j=0; j<4&&i>=0; ++j,--i,t*=10)sum+=(ch[i]-'0')*t;
		b.a[count]=sum;
		++count;
	}
	b.len=count++;
	return in;
}
ostream& operator<<(ostream& out,Bint& b) //重载输出运算符
{
	cout<<b.a[b.len-1];
	for(int i=b.len-2; i>=0; --i)
	{
		cout.width(DLEN);
		cout.fill('0');
		cout<<b.a[i];
	}
	return out;
}
Bint Bint::operator+(const Bint & T) const
{
	Bint t(*this);
	int i,big;      //位数
	big=T.len>len?T.len:len;
	for(i=0; i<big; ++i)
	{
		t.a[i]+=T.a[i];
		if(t.a[i]>MAXN)
		{
			++t.a[i+1];
			t.a[i]-=MAXN+1;
		}
	}
	if(t.a[big]!=0)t.len=big+1;
	else t.len=big;
	return t;
}
Bint Bint::operator-(const Bint & T) const
{
	int i,j,big;
	bool flag;
	Bint t1,t2;
	if(*this>T)
	{
		t1=*this;
		t2=T;
		flag=0;
	}
	else
	{
		t1=T;
		t2=*this;
		flag=1;
	}
	big=t1.len;
	for(i=0; i<big; ++i)
		if(t1.a[i]<t2.a[i])
		{
			j=i+1;
			while(t1.a[j]==0)++j;
			--t1.a[j--];
			while(j>i)t1.a[j--]+=MAXN;
			t1.a[i]+=MAXN+1-t2.a[i];
		}
		else t1.a[i]-=t2.a[i];
	t1.len=big;
	while(t1.a[t1.len-1]==0&&t1.len>1)--t1.len,--big;
	if(flag)t1.a[big-1]=0-t1.a[big-1];
	return t1;
}
Bint Bint::operator*(const Bint & T) const
{
	Bint ret;
	int i,j,up;
	int temp,temp1;
	for(i=0; i<len; ++i)
	{
		up=0;
		for(j=0; j<T.len; ++j)
		{
			temp=a[i]*T.a[j]+ret.a[i+j]+up;
			if(temp>MAXN)
			{
				temp1=temp-temp/(MAXN+1)*(MAXN+1);
				up=temp/(MAXN+1);
				ret.a[i+j]=temp1;
			}
			else up=0,ret.a[i + j]=temp;
		}
		if(up!=0)ret.a[i+j]=up;
	}
	ret.len=i+j;
	while(ret.a[ret.len-1]==0&&ret.len>1) --ret.len;
	return ret;
}
Bint Bint::operator/(const int & b) const
{
	Bint ret;
	int i,down=0;
	for(i=len-1; i>=0; --i)
	{
		ret.a[i]=(a[i]+down*(MAXN+1))/b;
		down=a[i]+down*(MAXN+1)-ret.a[i]*b;
	}
	ret.len=len;
	while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len;
	return ret;
}
int Bint::operator %(const int & b) const
{
	int i,d=0;
	for (i=len-1; i>=0; --i)d=((d*(MAXN+1))%b+a[i])%b;
	return d;
}
Bint Bint::operator^(const int & n) const
{
	Bint t,ret(1);
	if(n<0)exit(-1);
	if(n==0)return 1;
	if(n==1)return *this;
	int m=n,i;
	while(m>1)
	{
		t=*this;
		for(i=1; i<<1<=m; i<<=1)t=t*t;
		m-=i;
		ret=ret*t;
		if(m==1)ret=ret*(*this);
	}
	return ret;
}

struct node
{
	string name;
	Bint coin;
	bool operator < (const node &t)
	{
		return t.coin < coin;
	}
}a[1005];
int ans[1005], n, k;
Bint zero,sum;

int main()
{
	
	cin >> n >> sum;
	for(int i = 1; i <= n; i++)
	cin >> a[i].name >> a[i].coin;
	
	sort(a+1, a+n+1);

	for(int i = 1; i <= n ; i++)
	if(a[i].coin <= sum)
	{
		sum = sum - a[i].coin;
		ans[k++] = i;
	}
	
	if(sum == zero)
	{
		cout << k << endl;
		for(int i = 0; i < k; i++)
		cout << a[ans[i]].name << endl;
	}
	else
		cout << '0' << endl;
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值