天梯2

1.红石难题(将红石线路拉成一条一维的线,再用总线路除一个红石源可满足的能量需求范围,不够进一即可)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1000000],b[10000000];
signed main()
{
    int n,m;
    cin>>n>>m;
    int ans=1;
    for(int i=0;i<n;i++)
    {
        cin>>a[i]>>b[i];
        if(i)ans+=abs(a[i-1]-a[i])+abs(b[i-1]-b[i]);
    }
    if(m==0)cout<<0<<endl;
    else
    {
        int d=(15-m)*2+1;
int res;
if(ans%d!=0) res=ans/d+1;
else res=ans/d; cout<<res<<endl; } return 0; }

2.奶茶袋收集(隔板法,求一个差分数列,排序后前n-m项和就是所求)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100000],b[1000000];
signed main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n-1;i++)
    {
        b[i]=a[i+1]-a[i];
    }
    sort(b,b+n-1);
    int sum=0;
    for(int i=0;i<n-m;i++)
        sum+=b[i];
    cout<<sum<<endl;
    return 0;
}

3.该加训了(换位异或的性质,推算后我们可得出f(a,b)=a^b,又例如a^b^c=x,b^c=y,那么a=x^y,由此我们可得出f(l-1)^f(l,r)=f(r),f(l,r)=f(r)^f(l-1))

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1000000],b[10000000];
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=b[i-1]^a[i];
    }

    int m;
    cin>>m;
    int l,r;
    while(m--)
    {
        cin>>l>>r;
        cout<<(b[r]^b[l-1])<<endl;
    }
    return 0;
}

4.cy的倒金字塔工厂(使用栈和队列进行模拟,按照条件写即可)

#include<bits/stdc++.h>
#define int long long
using namespace std;
stack<int> l,b,h;//l:流水线,b:盒子,h:半成品,r:垃圾
queue<int> r;
signed main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        int a;
        cin>>a;
        l.push(a);
    }
    while(!l.empty()||!b.empty())
    {
        if(!l.empty())
        {

            if(h.empty())
            {
                h.push(l.top());
                l.pop();
            }
            else
            {
                if(l.top()>h.top()&&l.top()-h.top()<=k)
                {
                    h.push(l.top());
                    l.pop();
                }
                else
                {
                    if(!b.empty()&&b.top()>h.top()&&b.top()-h.top()<=k)
                    {
                         h.push(b.top());
                         b.pop();
                    }
                    b.push(l.top());
                    l.pop();
                }
            }
        }
        if(l.empty())
        {
            if(h.size()>=2)
            {
                while(!h.empty())
                {
                    cout<<h.top()<<" ";
                    h.pop();
                }
                cout<<endl;
            }
            else
            {
                r.push(h.top());
                h.pop();
            }
            stack<int>t;
                while(!b.empty())//装到流水线末尾(为了顺序正确找个中间栈)
                {
                    t.push(b.top());
                    b.pop();
                }
                while(!t.empty())
                {
                    l.push(t.top());
                    t.pop();
                }
            }
        }
    while(!r.empty())
    {
        cout<<r.front()<<" ";
        r.pop();
    }
    return 0;
}

5.swj学长的精灵融合(用vector存图,将与x有关的精灵全部存入res中,并在输入时将精灵的品种和等级记录,最后遍历累加res中除x外精灵所需经验)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100000],b[1000000],d1[100],d2[100],d3[100],p[1000000],q[1000000];
int x,m;
vector<int> v[1000000],res;
struct jing
{
    int a;
    int b;
    int c;
    int d;
};
struct jing j[100000];
void dfs(int n)
{
    res.push_back(n);
    for(auto&t:v[n])
    {
        dfs(t);
    }
}
signed main()
{
    cin>>x>>m;
    for(int i=0;i<m;i++)
    {
        cin>>j[i].a>>j[i].b>>j[i].c>>j[i].d;
        v[j[i].a].push_back(j[i].b);
        p[j[i].b]=j[i].c;
        q[j[i].b]=j[i].d;
    }
    d1[1]=0,d2[1]=0,d3[1]=0;
    d1[2]=1,d2[2]=1,d3[2]=1;
    for(int i=3;i<=100;i++)
    {
        d1[i]=d1[i-1]+i-2;
        d2[i]=d2[i-1]+2*(i-2);
        d3[i]=d3[i-1]+5*(i-2);
    }
    dfs(x);
    int sum=0;
    for(auto&t:res)
    {
        int c,d;
        c=p[t],d=q[t];
        if(t==x)continue;
        else {
            if (c== 1)sum += d1[d];
            else if (c == 2)sum += d2[d];
            else sum += d3[d];
        }
    }
    cout<<sum<<endl;
    return 0;
}

  

posted @ 2024-03-10 16:12  伊芙加登  阅读(32)  评论(0)    收藏  举报