洛谷:P9692 [GDCPC2023

文章目录

    • c++STL库 Pair

c++STL库 Pair

P9692 [GDCPC2023] Trading

代码

题目是一个贪心的问题,每个店只能交易n次,贪心的思路就是买入选择最前面的店,卖出选择后面的店。用c++STL库Pair来存储这个价格和对应交易的次数,对pair按照价格进行排序。调用sort进行排序,sort是默认升序排序,比较第一个值的大小,如果第一个值相等,再比较第二个值得大小。循环里面找出i和j次数最小的出来交易,而后对应得次数减去交易次数,如果等于0了。那么i和j就需要各自去移动。指导i=j,不能在交易了。
#include 
using namespace std;

#define MAXN ((int)1e5) // 宏定义

typedef pair<int, int> pii;

pii A[MAXN + 10]; //创建了长度为MAN+10得键值对

int n;
long long ans;

void solve()
{
  cin >> n;
  for (int i = 1; i <= n; i++)
  {
    cin >> A[i].first >> A[i].second; //first 和second 
  }

  sort(A + 1, A + n + 1); //排序下
  ans = 0;
  for (int i = 1, j = n; i < j;)
  {
    int mn = min(A[i].second, A[j].second);//第一个和最后一个得数列进行比较 在一家股买最后一家出售
    ans += 1LL * (A[j].first - A[i].first) * mn;//后的价格更高
    A[i].second -= mn;//两个同时都是卖出和买入mn个,都需要-- 
    A[j].second -= mn;

    if (A[i].second == 0) //如果遇到为0得情况就说明了 这个店得交易已经结束了 i和j就需要++和--换下一个店来购买
    {
      i++;
    }
    if (A[j].second == 0)
      j--;
  }
  cout << ans << endl;
}

//标准得解法 代码风格都是写函数
int main()
{
  int t;
  cin >> t;
  while (t-- > 0)
  {
    solve();
  }
}

你可能感兴趣的:(算法综合2023年底,算法,数据结构)