栈/队列/贪心

我的心愿是世界和平!

#include<iostream>
#include<stack>
using namespace std;
int main()
{
    stack<int>s;//创造一个栈.
    s.push(1);//添加栈顶元素.
    s.push(2);
    s.push(3);
    cout<<s.size()<<endl;//获得队列大小.
    while(!s.empty())//判断栈是否为空,如果是,返回1;如果不是,返回0.
    {
        cout<<s.top()<<endl;//返回栈顶元素.
        s.pop();//删除栈顶元素.
    }
}

队列

#include<iostream>
#include<queue>
using namespace std;
int main()
{
    queue<int>q;//创造一个队列.
    q.push(1);//添加队尾元素.
    q.push(2);
    q.push(3);
    cout<<q.size()<<endl;//获得队列大小.
    while(!q.empty())//判断队列是否为空,如果是,返回1;如果不是,返回0.
    {
        cout<<q.front()<<endl;//返回队头元素.
        q.pop();//删除队头元素.
    }
    return 0;
}

双端队列

#include<iostream>
#include<deque>
using namespace std;
int main()
{
    deque<int>d;//创建一个双端队列.
    deque<int>de;
    d.push_back(40);//添加队尾元素.
    d.push_back(50);
    d.push_back(60);
    for(int i=0;i<d.size();i++)//获得队列大小.
    {
        cout<<d.at(i)<<endl;//输出队列中第(i+1)个元素.
    }
    cout<<endl;
    d.push_front(30);//添加队头元素.
    d.push_front(20);
    d.push_front(10);
    for(int i=0;i<d.size();i++)
    {
        cout<<d.at(i)<<endl;
    }
    cout<<endl;
    d.pop_front();
    d.pop_back();
    for(int i=0;i<d.size();i++)
    {
        cout<<d.at(i)<<endl;
    }
    cout<<endl;
    if(d.empty()==1)//判断队列是否为空,如果是,返回1;如果不是,返回0.
        cout<<"kong"<<endl;
    else
        cout<<"feikong"<<endl;
    cout<<endl;
    d.resize(3);//重新制定队列的长度,从队尾删除多余元素.
    for(int i=0;i<d.size();i++)
    {
        cout<<d.at(i)<<endl;
    }
    cout<<endl;
    de.push_back(21);
    de.push_back(31);
    de.push_back(41);
    de.swap(d);//把d和de中的元素互换.
    for(int i=0;i<de.size();i++)
    {
        cout<<de.at(i)<<endl;
    }
    cout<<endl;
    for(int i=0;i<d.size();i++)
    {
        cout<<d.at(i)<<endl;
    }
    cout<<endl;
    cout<<d.front()<<endl;//返回队头元素.
    cout<<d.back()<<endl;//返回队尾元素.
    cout<<endl;
    d.clear();
    de.clear();
    if(d.empty()==1)
        cout<<"kong"<<endl;
    else
        cout<<"feikong"<<endl;
    return 0;
}

优先队列

#include<iostream>
#include<queue>
#include<vector>
#include<cstdio>
using namespace std;
struct cmp{
    int data;
    friend bool operator<(cmp x,cmp y)
    {
        return x.data>y.data;
    }
}stu;
int main()
{
    priority_queue<int,vector<int>,greater<int> >p;//创造一个从小到大的队列.
    priority_queue<int,vector<int>,less<int> >q;//创造一个从大到小的队列.
    p.push(1);p.push(7);p.push(5);
    q.push(1);q.push(7);q.push(5);
    while(!p.empty())
    {
        printf("%d ",p.top());
        p.pop();
    }
    cout<<endl;
    while(!q.empty())
    {
        printf("%d ",q.top());
        q.pop();
    }
    cout<<endl;
    //大部分同队列.
    priority_queue<cmp>s;//创造一个从小到大的队列.
    stu.data=1;
    s.push(stu);
    stu.data=7;
    s.push(stu);
    stu.data=5;
    s.push(stu);
    while(!s.empty())
    {
        printf("%d ",s.top().data);
        s.pop();
    }
}

1796-I

题目来源:http://acm.sdibt.edu.cn:8080/vjudge/contest/view.action?cid=1796#problem/I
清洗工作,给定区间,求至少需要多少奶牛参加工作。
思路:左端固定,找右端最大值。

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct cow
{
    int a;
    int b;
} s[25010];
int cmp(const void *a,const void *b)
{
    struct cow *x=(cow *)a;
    struct cow *y=(cow *)b;
    if(x->a==y->a)
        return x->b-y->b;
    return x->a-y->a;
}
int main()
{
    int m,n,i;
    scanf("%d%d",&m,&n);
    for(i=0; i<m; i++)
        scanf("%d%d",&s[i].a,&s[i].b);
    qsort(s,m,sizeof(s[0]),cmp);
    if(s[0].a!=1)
        printf("-1");
    else
    {
        int sum=1,t,k;
        t=s[0].b;
        i=1;
        while(t<n)
        {
            k=t+1;
            while(i<m)
            {
                if(s[i].a<=k&&s[i].b>=k)
                    if(t<s[i].b)
                        t=s[i].b;
                if(s[i].a>k)
                    break;
                i++;
            }
            if(k>t)
                break;
            sum++;
        }
        if(t==n)
            printf("%d",sum);
        else
            printf("-1");
    }
    return 0;
}

1799-D

题目来源:http://acm.sdibt.edu.cn:8080/vjudge/contest/view.action?cid=1799#problem/D
结构体自定义优先队列。

#include<iostream>
#include<algorithm>
#include<deque>
#include<stack>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
using namespace std;
struct cow{
    int min;
    int max;
    int num;
    int home;
}co[50010];
int cmp(const void *x,const void *y)
{
    struct cow *a=(cow *)x;
    struct cow *b=(cow *)y;
    return a->min-b->min;
}
int cm(const void *x,const void *y)
{
    struct cow *a=(cow *)x;
    struct cow *b=(cow *)y;
    return a->num-b->num;
}
struct pai{
    int shu;
    int t;
    friend bool operator<(pai x,pai y)
    {
        return x.shu>y.shu;
    }
}pa;
int main()
{
    int m,i,t=0;
    scanf("%d",&m);
    priority_queue<pai>p;
    for(i=0;i<m;i++)
    {
        scanf("%d%d",&co[i].min,&co[i].max);
        co[i].num=i;
    }
    qsort(co,m,sizeof(co[0]),cmp);
    t++;
    pa.shu=co[0].max+1;
    pa.t=t;
    p.push(pa);
    co[0].home=1;
    for(i=1;i<m;i++)
    {
        if(co[i].min>=p.top().shu)
        {
            co[i].home=p.top().t;
            p.pop();
            pa.shu=co[i].max+1;
            pa.t=co[i].home;
            p.push(pa);
        }
        else
        {
            co[i].home=++t;
            pa.shu=co[i].max+1;
            pa.t=t;
            p.push(pa);
        }
    }
    qsort(co,m,sizeof(co[0]),cm);
    printf("%d\n",t);
    for(i=0;i<m;i++)
    {
        printf("%d\n",co[i].home);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值