Gym 101911A Coffee Break Gym - 101911C  Bacteria

这一场让我意识到了STL的重要性。

没有库里布莱恩特,自己一个人的尝试,Gym三星场,只做出来4道题,哎,太菜了。今天下午的天梯赛大的也不咋滴,自己一个人在101补昨天的题。

Gym 101911A  Coffee Break

题意:有一位工作人员想利用喝咖啡来休息,所以他给了我们一个数组a,表示他想喝咖啡的时间点(假设她喝咖啡的时间不计),但是呢,他要是频繁喝咖啡老板就不同意了,所以每次喝咖啡的间隔要大于d。问他要将数组中的时间点都经历一边至少要多少天。并把每个时间点是在第几天喝咖啡的输出。
简单来说,就是将这个数组分成n段,每段中每两个数之差大于d。求n的最小值。

这题我是用set做的,不过貌似也能用优先队列做。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 1000000010//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
int n,m,d;
int a[200010];
set<int> s;
map<int,int> mp;
int main()
{
    cin>>n>>m>>d;
    rep(i,1,n)
        cin>>a[i];
    rep(i,1,n)
        s.insert(a[i]);
    set<int>::iterator it;
    int cnt=0;
    int ans=1;
    while(s.size())
    {
        it=s.lower_bound(cnt);  
//在set中查找第一个大于等于cnt的数所在的位置,如果不存在,返回s.end()
        if(it==s.end())
        {
            ans++;
            cnt=0;
        }
        else
        {
            mp[*it]=ans;
            s.erase(*it);   //删除set中值为*it的数
            cnt=*it+d+1;
        }
    }
    cout<<ans<<endl;
    rep(i,1,n)
        cout<<mp[a[i]]<<" ";
    return 0;
}

Gym - 101911C  Bacteria

题意:给出n个细胞的大小,两个一样大的细胞可以合成一个两倍大小的,也可以增加任意大小任意个细胞,问至少需要多少个细胞可以将所有细胞合成一个,不能合成一个输出-1。

这个题对于我来说的意义就是让我联系一下STL。

AC代码:

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 1000000010//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
priority_queue<ll,vector<ll>, greater<ll> > q;  //从小到大排列,先输出小的
//priority_queue<int> q;   //从大到小排列,先输出大的
int main()
{
    ll n;
    cin>>n;
    ll x;
    rep(i,1,n)
    {
        scanf("%I64d",&x);
        q.push(x);
    }
    ll ans=0;
    while(q.size()>1)
    {
        ll a=q.top();
        q.pop();
        ll b=q.top();
        q.pop();
        if(a==b)
        {
            q.push(2*a);
        }
        else
        {
            if(2*a>b)
                {cout<<"-1";return 0;}
            else
            {
                q.push(b);
                q.push(2*a);
                ans++;
            }
        }
    }
    cout<<ans;
    return 0;
}

再贴一个runtime error on test 24的,用set实现的,不知道哪错了......

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 1000000010//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
multiset <ll> s;
int main()
{
    ll n;
    cin>>n;
    ll x;
    rep(i,1,n)
    {
        scanf("%I64d",&x);
        s.insert(x);
    }
    ll ans=0;
    multiset <ll>::iterator it1;
    multiset <ll>::iterator it2;
    multiset <ll>::iterator it;
    multiset <ll>::iterator itt;
    while(1)
    {
        itt=s.end();    //返回set中最后一个元素的下一个位置
        itt--;  //迭代器不能加1减1,但是能自加自减
        if(s.size()==0)
            break;
        if(*s.begin()==*itt&&s.count(*s.begin())==1)
            break;
        it2=s.begin();
        it2++;
        it1=s.begin();
        if(*it1==*it2)
        {
            s.erase(it1);   //删除迭代器所指位置的那一个元素,只删除一个
            s.erase(it2);
            s.insert(2*(*it1));
        }
        else
        {
            if(*it1*2>*it2)
                {cout<<"-1";return 0;}
            else
            {
                ans++;
                s.insert(2*(*it1));
                s.erase(it1);
            }
        }
        if(*(s.begin())<0)
            {cout<<"-1";return 0;}

    }
    cout<<ans;
    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值