zoukankan      html  css  js  c++  java
  • upc组队赛1 闪闪发光 【优先队列】

    闪闪发光

    题目描述

    一所位于云南昆明的中医药本科院校--云南中医学院。

    因为报考某专业的人数骤减,正面临着停招的危机。

    其中有九名少女想到一条妙计——成为偶像,

    只要她们成为偶像,学校的名气便会增加,而报考的人数亦会上升。

    就这样,九位个性鲜明的少女决定一起努力成为偶像。

    希望可以凭借偶像的名气增加生源来挽救自己所喜爱的专业,让自己的学校闪闪发光。

    她们为了成为偶像,第一步对于她们来说是减肥!

    这里有n个重物,第i个重物的重量是2^{w_i}。她们每天任务要完成的重量是n个重物的重量和。

    每次举重的重量和必须是2的幂,重物数量不要求。

    但是为了方便,要使举重的次数最少。

    输入

    多组数据。
    每组数据第一行一个整数n。(1 <= n <= 10^6)
    第二行有n个整数w_1,w_2,...,w_n。(0 <= w_i <= 1000000)

    输出

    输出最少的举重次数。

    样例输入

    5
    1 1 2 3 3

    样例输出

    2

    提示

    1,1,2一组;
    3,3一组。

    题解

    把小的数可以组合的组合起来,不能继续组合的数量就是答案

    用优先队列就很简单了;

    弹出队首x,如果和接下来的队首相等 就继续弹出队首,将x+1入队

    如果不相等 或者队列已经空了 那就计数++;

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    typedef pair<int,int> P;
    #define all(x) x.begin(),x.end()
    #define readc(x) scanf("%c",&x)
    #define read(x) scanf("%d",&x)
    #define read2(x,y) scanf("%d%d",&x,&y)
    #define read3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define print(x) printf("%d
    ",x)
    #define mst(a,b) memset(a,b,sizeof(a))
    #define lowbit(x) x&-x
    #define lson(x) x<<1
    #define rson(x) x<<1|1
    #define pb push_back
    #define mp make_pair
    #define PI acos(-1.0)
    const int maxn = 1e6+5;
    int n;
    int w[maxn];
    int ans;
    int main(){
    
      priority_queue<int,vector<int>,greater<int>> q;
      while(read(n)!=EOF){
        while(!q.empty()) q.pop();
        for(int i = 0 ; i < n; i++){
          read(w[i]);
          q.push(w[i]);
        }
        ans = 0;
        while(!q.empty()){
          int p = q.top();
          q.pop();
          if(p != q.top() || q.empty()){
            ans ++;
          //  cout << p <<endl;
          }
          else{
            q.pop();
            q.push(p+1);
          }
        }
        print(ans);
      }
    }
    

    队友用数组过的,思想是一样的,需要注意的地方是数组需要开的够大

     #include<bits/stdc++.h>
    using namespace std;
    
    #define memset(x,y) memset(x,y,sizeof(x))
    #define memcpy(x,y) memcpy(x,y,sizeof(y))
    #define pri(x) printf("%d
    ",x)
    #define pri2(x,y) printf("%d %d
    ",x,y)
    #define pris(x) printf("%s
    ",x)
    #define prl(x) printf("%lld
    ",x)
    #define all(x) x.begin(),x.end()
    #define readc(x) scanf("%c",&x)
    #define read(x) scanf("%d",&x)
    #define read2(x,y) scanf("%d%d",&x,&y)
    #define read3(x,y,z) scanf("%d%d%d",&x,&y,&z)
    #define print(x) printf("%d
    ",x)
    #define lowbit(x) x&-x
    #define lson(x) x<<1
    #define rson(x) x<<1|1
    #define pb push_back
    #define mp make_pair
    #define INF 0x3f3f3f3f
    typedef pair<int,int> P;
    typedef long long LL;
    typedef long long ll;
    const double eps=1e-8;
    const int MAXN=1e6+7;
    const int maxn=5000000+10;
    const int maxm = 1;
    const int mod=1e9+7;
    int n;
    int T;
    int ans = 0;
    int w[maxn];
    int x;
    int main()
    {
        while(read(n)!=EOF)
        {
          int cnt = 0;
          memset(w,0);
          for(int i = 0 ; i < n; i++){
             read(x);
             w[x] ++;
          }
          for(int i = 0; i < 5000000+5; i++)
          {
             if(w[i] % 2 == 1) cnt++;
             w[i+1] += w[i] / 2;
          }
    
          printf("%d
    ",cnt);
        }
        return 0;
    }
    
  • 相关阅读:
    异常单据锁定涉及的数据库表
    用友通只启用核算模块
    一个迟到MM如何让老师疯掉的
    偷偷看,别笑出声啊
    安装时又提示删除程序
    自动折行的设置
    酒后百态新编 恶搞
    系统管理中“站点”“运行状态”的含义
    神经病女士银行取钱
    HDOJ 1017
  • 原文地址:https://www.cnblogs.com/llke/p/10789746.html
Copyright © 2011-2022 走看看