C - Choosing flowers

C - Choosing flowers

实力不够,经验不足,心态不稳,哎
假设最优策略里面选择了几种买了不止一支,其余的可能只卖了一支,就直接按照a的从大到小买,对于b的贡献,按照b排序,那么b序列的贡献
b [ x 1 ] > b [ x 2 ] > b [ x 3 ] b[x1]>b[x2]>b[x3] b[x1]>b[x2]>b[x3]
既然这样,我还傻着逼脸买后面的,我脑子哎,都直接买第一个就行了,所以就直接最多最多存在一支花买了好多个,其余买一支的就直接按照a的大小买。枚举一下b就行了,

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std ;
#define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)
#define x first
#define y second
typedef long long ll ;
const double esp = 1e-6 , pi = acos(-1) ;
typedef pair<ll , ll> PII ;
const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
ll in()
{
  ll x = 0 , f = 1 ;
  char ch = getchar() ;
  while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}
  while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;
  return x * f ;
}
PII a[N] ;
ll c[N] , d[N] ;
void work(){
  int n = in() , m = in() ;
  for(int i = 1; i <= m ;i ++ )  a[i].x = in() , a[i].y = in() ;
  sort(a + 1 , a + m + 1) ;
  for(int i = 1; i <= m ;i ++ ) d[i] = a[i].x , c[i] = c[i - 1] + a[i].x ;
  ll ans = 0 ;
  if(n <= m) ans = c[m] - c[m - n] ;
  for(int i = 1; i <= m ;i ++ ) {
    int pos = lower_bound(d + 1 ,d + m + 1 , a[i].y) - d ;
    int x = m - pos + 1 ;
    if(n >= x) 
      ans = max(ans , c[m] - c[pos - 1] + 1ll * (n - x) * a[i].y + (pos > i ? a[i].x - a[i].y : 0)) ;
  }
  printf("%lld\n" , ans) ;
  return ;
}
int main()
{
  int t = in() ;
  while(t --) work() ;
  return 0 ;
}
/*
*/


你可能感兴趣的:(CF)