概要

不算难,但是简单模拟没写对

题目

T1

随便模拟一下就行,怎么也不会 T。

#include<bits/stdc++.h>
using namespace std;
int n,t,x=1,y=1;
int main()
{
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
    cin>>n>>t;
    for(int i=1;i<=t;i++)
    {
        y++;
        if(y>n)
        {
            x++;
            y=1;
        }
        if(x>n)
        {
            x=1;
            y=1;
        }
    }
    cout<<x<<" "<<y<<"\n";
    return 0;
}

T2

贪心

  • 如果赔本就不选
  • 否则按代价升序,如果当前选不了就可以直接 break
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int n;
LL ans;
struct node
{
    LL val,uval,jval;
}a[100010];
bool cmp(node s1,node s2)
{
    if(s1.jval>0 && s2.jval>0)
    {
        return s1.uval<s2.uval;
    }
    return s1.jval>s2.jval;
}
int main()
{
    freopen("collect.in","r",stdin);
    freopen("collect.out","w",stdout);
    scanf("%d%lld",&n,&ans);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld%lld",&a[i].val,&a[i].uval);
        a[i].jval=a[i].val-a[i].uval;
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        if(ans<a[i].uval)
        {
            break;
        }
        if(a[i].jval<=0)
        {
            break;
        }
        ans+=a[i].jval;
    }
    printf("%lld\n",ans);
    return 0;
}

T3

根据题意模拟即可

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int id,gz,y;
    char work;
    string name;
}a[30];
struct cnode
{
    string name;
    int id,gz,y,iid;
    char work;
}b[30];
string tnc,q,master;
int p[10],cnt=2,team_boss_id;
bool cmp1(node s1,node s2)
{
    if(s1.gz==s2.gz)
    {
        return s1.id<s2.id;
    }
    return s1.gz<s2.gz;
}
bool cmp2(cnode s1,cnode s2)
{
    if(s1.iid==team_boss_id)
    {
        return 1;
    }
    if(s2.iid==team_boss_id)
    {
        return 0;
    }
    if(s1.gz==s2.gz)
    {
        return s1.id<s2.id;
    }
    return s1.gz<s2.gz;
}
int main()
{
    freopen("footballteam.in","r",stdin);
    freopen("footballteam.out","w",stdout);
    for(int i=1;i<=22;i++)
    {
        cin>>a[i].id>>a[i].name>>a[i].work;
        getline(cin,tnc);
        //cerr<<"READ IS OK\n";
        int st=0,ed=0;
        for(int j=0;j<tnc.size();)
        {
            if(tnc[j]==' ')
            {
                a[i].y+=(ed-st+1);
                ed=0,st=0;
                j++;
            }
            else if(tnc[j]>='0' && tnc[j]<='9')
            {
                st=(tnc[j]-48)*1000+(tnc[++j]-48)*100+(tnc[++j]-48)*10+(tnc[++j]-48);
                j++;
            }
            else if(tnc[j]=='-')
            {
                ed=(tnc[++j]-48)*1000+(tnc[++j]-48)*100+(tnc[++j]-48)*10+(tnc[++j]-48);
                j++;
            }
        }
        a[i].y+=(ed-st+1);
        cerr<<ed<<" "<<st<<" ";
        cerr<<a[i].y<<"\n";
        if(a[i].work=='S')
        {
            a[i].gz=4;
        }
        else if(a[i].work=='M')
        {
            a[i].gz=3;
        }
        else if(a[i].work=='D')
        {
            a[i].gz=2;
        }
        else if(a[i].work=='G')
        {
            a[i].gz=1;
        }
    }
    sort(a+1,a+1+22,cmp1);
    cin>>q;
    for(int i=0;i<q.size();i++)
    {
        if(q[i]=='-')
        {
            cnt++;
        }
        else
        {
            p[cnt]=p[cnt]*10+(q[i]-48);
        }
    }
    cnt=0;
    p[1]=1;
    b[0].id=0;
    b[0].y=0; 
    for(int i=1;i<=22;i++)
    {
        if(p[a[i].gz]>0)
        {
            b[++cnt].id=a[i].id;
            b[cnt].iid=cnt;
            b[cnt].name=a[i].name;
            b[cnt].work=a[i].work;
            b[cnt].gz=a[i].gz;
            b[cnt].y=a[i].y;
            if(b[team_boss_id].y<b[cnt].y || (b[team_boss_id].y<=b[cnt].y && b[cnt].id>b[team_boss_id].id))
            {
                team_boss_id=cnt;
            }
            p[a[i].gz]--;
        }
    }
    if(cnt!=11)
    {
        //cerr<<"CNT="<<cnt<<"\n";
        puts("IMPOSSIBLE TO ARRANGE");
        return 0;
    }
    sort(b+1,b+1+cnt,cmp2);
    for(int i=1;i<=cnt;i++)
    {
        cout<<b[i].id<<" "<<b[i].name<<" "<<b[i].work<<"\n";
    }
    return 0;
}

T4

此为 $\texttt{DP}$ 也,可是我不会。

用贪心也能过。

观察发现无非就是 小-大-小-大……

或 大-小-大-小(相比于相邻的)

如果不符合就累加并修改为极值

#include<bits/stdc++.h>
#define TBH 2147483646
#define small 1
#define big 2
using namespace std;
int ans,a[100010],n,b[100010];
int c1()
{
    int cnt=0;
    a[n+1]=-1919810;
    for(int i=2;i<=n;i+=2)
    {
        if(a[i]<=a[i+1] && a[i]<=a[i-1])
        {
            cnt++;
            a[i]=TBH;
        }
        else if(a[i]<=a[i+1])
        {
            cnt++;
            a[i+1]=-114514;
        }
        else if(a[i]<=a[i-1])
        {
            cnt++;
            a[i-1]=-114514;
        }
    }
    return cnt;
}
int c2()
{
    int cnt=0;
    a[n+1]=2147483647;
    for(int i=2;i<=n;i+=2)
    {
        if(a[i]>=a[i+1] && a[i]>=a[i-1])
        {
            cnt++;
            a[i]=-114514;
        }
        else if(a[i]>=a[i+1])
        {
            cnt++;
            a[i+1]=TBH;
        }
        else if(a[i]>=a[i-1])
        {
            cnt++;
            a[i-1]=TBH;
        }
    }
    return cnt;
}
int main()
{
    freopen("wave.in","r",stdin);
    freopen("wave.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i];
    }
    if(n<=2)
    {
        puts("0");
        return 0;
    }
    if(n==3)
    {
        if((a[2]>a[3] && a[2]>a[1]) || (a[2]<a[3] && a[2]<a[1]))
        {
            puts("0");
        }
        puts("1");
        return 0;
    }
    int a1=c1();
    for(int i=1;i<=n;i++)
    {
        a[i]=b[i];
    }
    int a2=c2();
    ans=min(a1,a2);
    cout<<ans<<"\n";
    return 0;
}
最后修改:2023 年 08 月 18 日
如果觉得我的文章对你有用,请随意赞赏