CF 1250 B. The Feast and the Bus (思维+尺取)CF86A Reflection (思维)

简介: 【6月更文挑战第13天】

链接

题意:

某公司的员工们要庆祝今天的第$256$天!该公司有$n$名员工和$k$个团队,每个员工仅属于$1$个团队,每个团队至少有$1$名员工。团队编号从$1$到$k$。现在给出$n$个数字:$t_1,t_2,……t_n$表示第$i$个员工属于第$t_i$ 个团队。该公司雇佣了一辆班车,这辆班车将会往返多次承载员工去参加宴会,每一次可以承载$1$个团队或者$2$个团队,且每一个团队不能分离,必须在同一次车上。这辆车可以承载$s$个员工,$s$可以为任意值,假设通过$r$次运输,所有的员工都到达宴会目的地了,该公司需要支付$sr$元(只有$1$辆班车)。现在要你计算$rs$的最小值。

$(n<=2e5,k<=8000)$

分析:

首先我们看两个属性 车的最大容量和车的数量,我们看他们的范围,因为我们想枚举这两个属性中的其中一个,来求答案。

  • 车数量:首先看数据范围为 $[\frac{k+1}{2},k]$ 左端点是都一个车放两组,右端点是一个车放一组。两个极端情况,然后再内层循环去取者k个数,复杂度还是$O(n^2)$抱着侥幸心理交了一下,T44.没错还是太大了 。毕竟是8000*8000.
    //枚举方式 : 车数量:
    void check(int i)
    {
         
      bool flag = 0;
      ll sum = 0;
      priority_queue<ll, vector<ll>, greater<ll> > mx;
      for(int j = k; j >= 1; j--)
      {
         
          if(flag == 0)
          {
         
              mx.push(b[j]);
          }
          else
          {
         
              ll top = mx.top();
              mx.pop();
              sum = max(top + b[j], sum);
          }
          if(mx.size() == i) flag = 1;
      }
      while(!mx.empty())
      {
         
          sum = max(sum, mx.top());
          mx.pop();
      }
      ans = min(sum * i, ans);
    }
    
  • 然后看按照车的最大容量数据范围是, 最小就是最大的那组 $b[k]$(排序后最后一个).最大为,两两结对最后两个结对也就是:$b[k]+b[k-1]$,这样再在内层循环放k个物品(我们可以用尺取去放),这样复杂度外层的 其实是 平均下来就是[n/k]但是不准,但是可以过。然后内层枚举的是k。

虽然枚举车的最大容量可以过但是不知道怎么就出问题了,尺取代码中的$l,r$设成ll就T,改成int就能过,有巨巨懂的话可以解释下吗?万分感谢。

///苟利国家生死以,岂因祸福避趋之。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 8000 + 7;
ll n, k;
ll b[maxn];
ll ans=1e18;

//枚举方式: 车的最大容量
void check(ll x)
{
   
    ll tmp = 0;
    int l = 1, r = k;
    while(l <= r) ///尺取
    {
   
        tmp++;
        if(l == r) break;
        if(b[l] + b[r] <= x) l++, r--;
        else r--;
    }
    ans = min(tmp * x, ans);
}

int main()
{
   
    cin>>n>>k;
    for(int i = 1; i <= n; i++)
    {
   
        ll x;
        scanf("%lld",&x);
        b[x]++;
    }
    sort(b + 1, b + 1 + k);
    for(ll i = b[k]; i <= b[k] + b[k - 1]; i++)
    {
   
        check(i);
    }
    cout<<ans;
    return 0;
}

链接

题意:

定义一个数的“Reflecion number”,是用9减去它的每一个数位后,再去掉前导0而形成的数,如192的“Reflecion number”是807(9-1=8,9-9=0,9-2=7)。

再定义一个数的“Weight”,它等于这个数自身乘以这个数的“Reflecion number”。

输入l和r${1<=l<=r<=10^9}$,输出l到r的数中"Weight"的最大值。

分析:

首先我们先看他们乘积发现他们的关系,
一个数x 的Re number 数是什么? 手模一个数 897 ,他的Re NUM为 (9-8)(9-9)(9-7)发现是102他与原数的关系是897+102=999,那么我们就可以直接通过求出其位数然后这么多9减去原数就是原数的Re number,然后我们就可以直接求出结果。

然后我们看看其具有的性质,我们发现答案不是最小的那个数,就是最大的那个数,要不就是5000...中间这个数,然后我们发现我们要先整出最优的一位数。后面就叠加。

///苟利国家生死以,岂因祸福避趋之。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5 + 7;
const int mod = 1e9 + 7;
const double pi = 3.14159265358979;


ll l,r;
ll g(ll x)///求函数
{
   
    ll t = 1;
    while (t <= x) t*=10;
    return (t-1-x)*x;
}

int main()
{
      
    cin >> l >> r;
    ll res = max(g(l),g(r));    
    ll t = 5;
    for(int i=0;i<=9;i++)
    {
   
        if (l <= t && t <= r)
            res = max(res,g(t));
        t*=10;
    }
    cout << res << endl;
    return 0;
}
目录
相关文章
|
7月前
|
设计模式 Java Maven
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
88 1
|
5月前
|
人工智能 BI
CF 1561 D. Up the Strip(数学+思维)
【7月更文挑战第5天】
53 10
|
6月前
CF 1538 G. Gift Set (贪心+思维)
【6月更文挑战第14天】
39 0
|
机器学习/深度学习
CF2A Winner(map+思维)
CF2A Winner(map+思维)
97 0
CF763A Timofey and a tree(思维)
CF763A Timofey and a tree(思维)
82 0
|
人工智能
CF1573B. Swaps(思维)
CF1573B. Swaps(思维)
96 0
CF1567C. Carrying Conundrum(思维)
CF1567C. Carrying Conundrum(思维)
93 0
|
人工智能 BI
CF761D Dasha and Very Difficult Problem(构造 思维)
CF761D Dasha and Very Difficult Problem(构造 思维)
84 0
CF1341C. Nastya and Strange Generator(思维 模拟 构造)
CF1341C. Nastya and Strange Generator(思维 模拟 构造)
87 0
CF76.E. Points (贡献 思维)
CF76.E. Points (贡献 思维)
77 0