• 题意:你有\(n\)个礼物,礼物有自己的种类,你想将它们按种类打包送人,但是打包的礼物数量必须不同(数量,与种类无关),同时,有些礼物你想自己留着,\(0\)表示你不想送人,问你在送出的礼物数量最大的同时,尽可能的使自己喜欢的留下来,输出能送出的最大礼物数,以及这些礼物中自己不喜欢的数目.

  • 题解:首先,我们肯定要让送出的礼物数最大,同时喜欢的最小,也就是送的礼物中,尽量让它的\(f\)是\(1\).这题考虑贪心,我们可以先对礼物数量进行排序,礼物数量相同让\(1\)多的排在前面,全部丢进优先队列里,用\(cur\)记录当前选的礼物数量,如果\(cur\)等于当前优先队列里拿出来的数量,由于\(cur\)表示上一次选的数量,所以当前礼物的数量就要\(-1\),注意!!!如果这个种类的礼物的\(f=1\)的数量和礼物数相同,那么\(f=1\)的数量也要\(-1\),因为你全是\(1\),去掉一个,\(f=1\)当然也要减一(这不是废话吗?).

  • 代码:

    struct misaka{
    int a;
    int f;
    bool operator < (const misaka & mikoto) const {
    if(a==mikoto.a) return f<mikoto.f;
    return a<mikoto.a;
    }
    }e; int t;
    int n;
    map<int,int> mp1,mp2;
    priority_queue<misaka,vector<misaka>> h; int main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--){
    cin>>n;
    int ans1=0;
    int ans2=0;
    mp1.clear();
    mp2.clear(); rep(i,1,n){
    int x,f;
    cin>>x>>f;
    mp1[x]++;
    mp2[x]+=f;
    } for(auto w : mp1){
    e={w.se,mp2[w.fi]};
    h.push(e);
    } int cur=-1; while(!h.empty() && cur!=0){
    misaka tmp=h.top();
    h.pop(); int val=tmp.a;
    int f=tmp.f; if(cur!=val){
    ans1+=val;
    ans2+=f;
    cur=val;
    }
    else{
    if(val==f){
    val--;
    f--;
    }
    else val--;
    h.push({val,f});
    }
    } while(!h.empty()) h.pop(); cout<<ans1<<' '<<ans2<<'\n'; } return 0;
    }

最新文章

  1. c# 字符串连接使用“+”和string.format格式化两种方式
  2. 算法實例-C#-信箱排序-PigeonHoleSort
  3. XCode模拟器上下黑边、显示不完整、适配问题
  4. 如何配置virtualBox端口转发
  5. python基础——使用元类
  6. 在matlab2015b中配置vlfeat-0.9.18
  7. 用Filter程序实现静态HTML页面的访问保护
  8. BZOJ1595 [Usaco2008 Jan]人工湖
  9. mysql server install
  10. C++ type_traits 原理
  11. openGPS.cn - 高精度IP定位原理,定位误差说明
  12. POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)
  13. 电脑本机ping通Linux虚拟机的方法
  14. Notepad++ JSON关键字自动提示
  15. Hbase王国游记之:Hbase客户端API初体验
  16. zk hdfs hadoop yarn hive 学习笔记
  17. Javascript 小练习
  18. AngularJS基于模块化的MVC实现
  19. Windows Server2008各版本区别
  20. extern字符串常量,宏定义字符串常量,怎么选

热门文章

  1. upload-labs 1-21关通关记录
  2. 【Oracle】增量备份和全库备份怎么恢复数据库
  3. 安装newman error:package exports for &#39;c:\nmp\node_modules\newman\node_module 解决办法
  4. CTFHub - Web(六)
  5. 4、python+selenium实现12306模拟登录
  6. Ubuntu安装Vivado
  7. es6语法详解
  8. Centos 7 关机和重启 命令
  9. 白日梦的Elasticsearch实战笔记,32个查询案例、15个聚合案例、7个查询优化技巧。
  10. 网络编程 — Linux TCP服务端和客户端