UPC-チョコレート購入(欲張り)
13674 ワード
チョコレートを買う
时间制限:1 Secメモリ制限:128 MB[提出][状态]テーマSHOI今回の科学技术コンテストで好成绩を収めたことを说明し、お祝いしたいと思っています.彼の手元には全部でM元があり、チョコレートを买って友达に楽しみを分かち合います.彼はSH店で逸選して購入し、チョコレートの商品棚にはN枚のチョコレートが入っています.各チョコレートの価格はa[i]元で、商店は販促のためにK枚のクーポンを提供し、使用方法は:各チョコレートに対して、1枚のクーポンを使用すれば、b[i]のお得な価格で購入.チョコレート1枚につき1枚のクーポンしか使用できないことに注意.一度しか購入できない.SHOIは自分が最大で何枚のチョコレートを購入できるかを知りたい.最初の行の3つの整数N,K,M(0≦K≦N≦100000,M≦1014)を入力する.次のN行は1行あたり2つの整数でa[i]を表すとbi.最大購入チョコレート数を表す整数を出力します.サンプル入力Copy 4 1 7 3 2 2 8 1 4 3サンプル出力Copy 3提示サンプル解釈:1、2、3枚目のチョコレートを選択し、そのうち3枚目はクーポンを使用し、合計5元です.
20%のデータN≦10について.50%のデータに対して:N≦100対100%のデータに対して:N≦100000
また欲張りされて、wa 7回
考え方:簡単な考え方で、まずすべてのクーポンを使い切って、お金が一番少なくて数量が一番多いなら、b順に並べます.そして残りの商品から見てどれだけ買えるか、その時はa順に並べ替える必要があります.1つの商品は1回しか使えないので、マークを付けます.料理の真実
时间制限:1 Secメモリ制限:128 MB[提出][状态]テーマSHOI今回の科学技术コンテストで好成绩を収めたことを说明し、お祝いしたいと思っています.彼の手元には全部でM元があり、チョコレートを买って友达に楽しみを分かち合います.彼はSH店で逸選して購入し、チョコレートの商品棚にはN枚のチョコレートが入っています.各チョコレートの価格はa[i]元で、商店は販促のためにK枚のクーポンを提供し、使用方法は:各チョコレートに対して、1枚のクーポンを使用すれば、b[i]のお得な価格で購入.チョコレート1枚につき1枚のクーポンしか使用できないことに注意.一度しか購入できない.SHOIは自分が最大で何枚のチョコレートを購入できるかを知りたい.最初の行の3つの整数N,K,M(0≦K≦N≦100000,M≦1014)を入力する.次のN行は1行あたり2つの整数でa[i]を表すとbi.最大購入チョコレート数を表す整数を出力します.サンプル入力Copy 4 1 7 3 2 2 8 1 4 3サンプル出力Copy 3提示サンプル解釈:1、2、3枚目のチョコレートを選択し、そのうち3枚目はクーポンを使用し、合計5元です.
20%のデータN≦10について.50%のデータに対して:N≦100対100%のデータに対して:N≦100000
また欲張りされて、wa 7回
考え方:簡単な考え方で、まずすべてのクーポンを使い切って、お金が一番少なくて数量が一番多いなら、b順に並べます.そして残りの商品から見てどれだけ買えるか、その時はa順に並べ替える必要があります.1つの商品は1回しか使えないので、マークを付けます.料理の真実
#include
using namespace std;
typedef long long ll;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int maxn=1e6+7;
ll n,k,m;
struct node{
ll a,b;
ll flag;///
};
node a[maxn];
bool cmp1(node a,node b){
return a.b<b.b;
}
bool cmp2(node a,node b){
if(a.flag==b.flag) return a.a<b.a;
return a.flag<b.flag;
}
int main(){
n=read();k=read();m=read();
for(int i=1;i<=n;i++){
a[i].a=read();a[i].b=read();
}
sort(a+1,a+1+n,cmp1);
int res=0;
for(int i=1;i<=k;i++){
if(a[i].b<=m){
m-=a[i].b;
a[i].flag=1;
res++;
}
}
if(m<=0){
cout<<res<<endl;
return 0;
}
sort(a+1,a+1+n,cmp2);
for(int i=1;i<=n;i++)
if(!a[i].flag){
if(a[i].a<=m){
m-=a[i].a;
res++;
}
if(m<=0){
cout<<res<<endl;
return 0;
}
}
cout<<res<<endl;
return 0;
}