CodeForces - 1380

CodeForces - 1380

A - Three Indices

O(n^2)暴力

int t,n,a[maxn];
bool ok[maxn];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        bool mark=false;
        scanf("%d",&n);
        rep(i,1,n)scanf("%d",&a[i]);
        rep(i,2,n-1)
        {
            int y=a[i],x=-1,z=-1;
            for (int j=1;j<i;j++)if (a[j]<y)x=j;
            for (int j=i+1;j<=n;j++)if (a[j]<y)z=j;
            if (x!=-1&&z!=-1)
            {
                printf("YES\n%d %d %d\n",x,i,z);
                mark=true;
                break;
            }
        }
        if (!mark)printf("NO\n");
    }
    return 0;
}



B - Universal Solution

与顺序无关,统计个数即可

int t;
char s[maxn];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        int len=strlen(s),shi=0,bu=0,jian=0;
        repp(i,0,len)
        {
            if (s[i]=='R')shi++;
            if (s[i]=='P')bu++;
            if (s[i]=='S')jian++;
        }
        if (shi>=bu&&shi>=jian)
        {
            rep(i,1,len)printf("P");puts("");
        }
        else if (bu>=shi&&bu>=jian)
        {
            rep(i,1,len)printf("S");puts("");
        }
        else
        {
            rep(i,1,len)printf("R");puts("");
        }
    }
    return 0;
}



C - Create The Teams

贪心思想是逆序遍历
正序遍历可能会造成“浪费”

int t,n,a[maxn],pos,x,minn;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&x);
        rep(i,1,n)scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        int pos=n,ans=0;
        while(pos>0)
        {
            int len=1;
            minn=a[pos];
            while(minn*len<x)
            {
                minn=a[--pos];
                if (pos<=0)break;
                len++;
            }
            pos--;
            if (minn*len>=x)ans++;
            if (pos<=0)break;
        }
        W(ans);
    }
    return 0;
}



D - Berserk And Fireball

1.将所有删除了的区间全部找出来
2.对这些区间一一遍历
3.判断性价比如果x/k>y,则尽可能使用第二种操作
但是使用第二种操作需要注意,最后剩下的值一定是该区间的最大值
如果该最大值无法依靠两边比它大的数被删掉,那么就得依靠第一种操作去删除
4.判断性价比如果x/k<=y,则尽可能使用第一种操作
如果区间长度不能整除k,也需要借助第二种操作
这时候同样需要考虑上述情况

int t,n,a[maxn],b[maxn],m,pos[maxn];
ll x,y,k,ans=0;
typedef pair<int,int> P;
vector<P> V;
int main()
{
    bool mark=true;
    scanf("%d%d",&n,&m);
    scanf("%lld%lld%lld",&x,&k,&y);
    rep(i,1,n)scanf("%d",&a[i]),pos[a[i]]=i;
    a[0]=a[n+1]=-1;
    rep(i,1,m)scanf("%d",&b[i]);
    if (b[1]!=a[1])V.pb(make_pair(1,pos[b[1]]-1));
    if (a[n]!=b[m])V.pb(make_pair(pos[b[m]]+1,n));
    rep(i,2,m)
    {
        int pos1=pos[b[i-1]],pos2=pos[b[i]];
        if (pos1>pos2)mark=false;
        if (pos1+1==pos2)continue;
        V.pb(make_pair(pos1+1,pos2-1));
    }
    if (!mark)
    {
        W(-1);
        return 0;
    }
    repp(i,0,V.size())
    {
        int L=V[i].first,R=V[i].second,len=R-L+1;
        int maxx=0;
        rep(j,L,R)maxx=max(maxx,a[j]);
        if (k*y<x)
        {
            if (maxx>a[L-1]&&maxx>a[R+1])
            {
                if (len>=k)ans+=x+(len-k)*y;
                else mark=false;
            }
            else ans+=len*y;
        }
        else
        {
            if (len>=k)ans+=x*(len/k)+y*(len%k);
            else
            {
                if (maxx>a[L-1]&&maxx>a[R+1])mark=false;
                else ans+=len*y;
            }
        }
    }
    if(!mark)W(-1);
    else WW(ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值