math --- CSU 1554: SG Value

简介: SG Value Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1554   Mean:  一个可重集合,初始为空,每次插入一个值,询问这个集合的SG值(集合中的数字组合相加不能达到的最小值)是多少。

 SG Value

Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1554


 

Mean: 

一个可重集合,初始为空,每次插入一个值,询问这个集合的SG值(集合中的数字组合相加不能达到的最小值)是多少。

analyse:

这题方法很巧妙。

假设当前不能达到的最小值为v,对于要插入的一个新值x

1)如果x>v,那么v的值不会改变,我们用一个优先队列(从小到大)将x进队;

2)如果x<=v,那么v的值会改变为v+x,然后再判断队列中的元素,把队列中的元素当作新值x来处理,执行1、2操作,这样就能保证v一直是不能达到的最小值。

 

Time complexity: O(n)

 

Source code: 

 

//  Memory   Time 
//  1347K     0MS 
//   by : crazyacking 
//   2015-03-29-18.44 
#include<map> 
#include<queue> 
#include<stack> 
#include<cmath> 
#include<cstdio> 
#include<vector> 
#include<string> 
#include<cstdlib> 
#include<cstring> 
#include<climits> 
#include<iostream> 
#include<algorithm> 
#define MAXN 1000010 
#define LL long long 
using namespace std; 
  
priority_queue<LL,vector<LL>,greater<LL> > q; 
int main() 
{ 
        ios_base::sync_with_stdio(false); 
        cin.tie(0); 
//      freopen("C:\\Users\\Devin\\Desktop\\cin.cpp","r",stdin); 
//      freopen("C:\\Users\\Devin\\Desktop\\cout.cpp","w",stdout); 
        LL t; 
        while(cin>>t) 
        { 
                LL v=0;// biggest num 
                while(!q.empty()) q.pop(); 
                while(t--) 
                { 
                        LL type; 
                        cin>>type; 
                        if(type==1) // insert 
                        { 
                                LL num; 
                                cin>>num; 
                                if(num>v+1) 
                                { 
                                        q.push(num); 
                                } 
                                else
                                { 
                                        v+=num; 
                                        while(!q.empty()) 
                                        { 
                                                LL tmp=q.top(); 
                                                if(tmp<=v+1) 
                                                { 
                                                        v+=tmp; 
                                                        q.pop(); 
                                                } 
                                                else break; 
                                        } 
                                } 
                        } 
                        else cout<<v+1<<endl; 
                } 
        } 
        return 0; 
} 
/* 
  
*/
  
/************************************************************** 
    Problem: 1554 
    User: crazyacking 
    Language: C++ 
    Result: Accepted 
    Time:396 ms 
    Memory:1996 kb 
****************************************************************/
View Code

 

目录
相关文章
攻防世界---misc---Wire1
攻防世界---misc---Wire1
DFS56L TF RH1M KK ABB 120 TAS.580.0560G00
DFS56L TF RH1M KK ABB 120 TAS.580.0560G00
56 0
|
机器学习/深度学习 人工智能
CF788A Functions again
CF788A Functions again
69 0
__cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义
__cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义
101 0
__cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义
OP07CP运算放大器
TEXAS INSTRUMENTS OP07CP 运算放大器, 单路, 600 kHz, 1个放大器, 0.3 V/µs, ± 3V 至 ± 18V, DIP, 8 引脚
237 0
1000BASE-T/SX/LX/EX/ZX代表哪种SFP光模块?
今天给大家介绍常见的SFP光模块1000BASE-SX、1000BASE-LX、1000BASE-EX、1000BASE-ZX、1000BASE-T这五种传输介质标准代表是哪种光模块呢?1000BASE-LX、1000BASE-LH和1000BASE-LX/LH SFP光模块它们又有哪些区别?现由专业光模块制造商-易天光通信在本文中详细为你解答。
2735 0