私信TA

用户名:uq_26667239983

访问量:4472

签 名:

知识大海里的浪者

等  级
排  名 595
经  验 4243
参赛次数 0
文章发表 155
年  龄 18
在职情况 学生
学  校 湖南理工学院
专  业 软件工程

  自我简介:

解题思路:

注意事项:

参考代码:

#include<iostream>

#include<algorithm>

using namespace std;


bool cmp(int p1, int p2)

{

return p1 < p2;

}


int main()

{

int max;//价钱的上限

cin >> max;

int n;//商品个数

cin >> n;


//这里要开大一点,题目没有明确给出来,我试了好几次才找到30000的,10000是过不去的!!!

int a[30000];//存商品价钱

for (int i = 1; i <= n; i++)

{

cin >> a[i];

}


//将价钱从小到大排序

sort(a + 1, a + n + 1, cmp);

//上面排完序后,lift就指向小的价钱,也就是第一个元素

//rigt就指向大的价钱,也就是最后一个元素

int* lift = a+1;

int* rigt = a + n;


int count = 0;//记录数量


//下面的思路就是,先将最接近上限的两件物品选出来,并将它们的值赋为0

//移动的话只要移动指针的位置就行

//这时,肯定存在没有匹配成功的物品,而它们的值肯定不为0,后面我们就可以利用这一点

while(lift<rigt)

{

if ((*lift ) + (*rigt) <= max)

{

(*lift) = 0;

(*rigt) = 0;

count++;

lift++;

rigt--;

}

if ((*lift ) + (*rigt) > max)

{

rigt--;

}

}

//这里我们通过遍历,找到不为0的数,让数量加一,就可以得到最后的数量啦

for (int i = 1; i <= n; i++)

{

if (a[i] != 0)

{

count++;

}

}

cout << count;


return 0;

}


 

0.0分

0 人评分

  评论区

  • «
  • »