• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
magicat
博客园    首页    新随笔    联系   管理    订阅  订阅
上分之路 VP Codeforces Round #744 (Div. 3) ABDE

VP情况 4 / 8 

AC: A,B,D,E1 60 minutes

WA: C

 

4 127   +00:02 +00:28 -7 +00:58 +00:39      


 

手速还在线

D pair排个序,

分类讨论

  1. 个人最多的聚会>=其余n-1 人的聚会,这里答案就很清楚了
  2. 个人最多的聚会<其余n-1 人的聚会,将编号加入新数组里,
    数组下标,1~n/2 ~ n,这里就输出a[1~n/2],a[n/2+1~n]为答案
    感觉这里和某A题一样。

 

//  AC one more times
bool cmp1(PII c, PII d) { return c.fi > d.fi; }


void solve()
{
    int n;  cin>>n;
    vector<PII> a;
    for(int i=1;i<=n;i++)
    {
        int x;  cin>>x;
        if(x==0)    continue;
        else 
            a.push_back({x,i});
    }
    sort(a.begin(),a.end(),cmp1);
    int len=a.size(),sum=0;
    for(int i=1;i<len;i++)    
        sum+=a[i].fi;
    if(a[0].fi>=sum)
    {
        cout<<sum<<endl;
        for(int i=1;i<len;i++)
            while(a[i].fi--) 
                cout<<a[0].se<<" "<<a[i].se<<endl;
    }
    else
    {
        vector<int> b;
        for(auto it : a)
        {
            int ti=it.fi,na=it.se;
            while(ti--)
            {
                b.push_back(na);
            }
        }
        sort(b.begin(),b.end());
        cout<<b.size()/2<<endl;
        int f=b.size()/2-1,f2=b.size()-1;
        for(int i=f;i>=0;i--)
        {
            cout<<b[i]<<" "<<b[f2]<<endl;
            f2--;
        }
    }
    return;
}

int main()
{
    std::ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    
    int T;cin>>T;for(int i=1;i<=T;i++)
        solve();    


    return 0;
}

 

 

 

B模拟,先确定大的数,通过左移到位置上,n-1次操作就能完成。

 

//  AC one more times
struct ans
{
    int l,r,d;
};

void solve()
{
    ans res[55];
    int cnt=0;
    int n;   LL a[55];
    cin>>n; 
    LL b[55];
    for(int i=1;i<=n;i++)   
    {
        cin>>a[i];    b[i]=a[i];
    }
    sort(b+1,b+1+n);

    for(int i=n;i>=2;i--)
    {
        LL t=b[i];
        for(int j=i;j>=1;j--)
        {
            if(a[j]==t&&i==j)   break;
            if(a[j]==t&&i!=j)
            {
                res[++cnt]={1,i,j};
                int times=j;
                while(times--)
                {
                    LL q=a[1];
                    for(int k=2;k<=i;k++)
                        a[k-1]=a[k];
                    a[i]=q;
                }
                break;
            }
        }
    }

    cout<<cnt<<endl;
    for(int i=1;i<=cnt;i++)
        cout<<res[i].l<<" "<<res[i].r<<" "<<res[i].d<<endl;
    return;
}
int main()
{
    std::ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    
    int T;cin>>T;for(int i=1;i<=T;i++)
        solve();    


    return 0;
}

 

 

 

 

E1 按字典序加入双端队列就出来了

C假题了,一直没有调出来wa2

正确作法是找点 '* '从左上和右上方向遍历,记录路径长度,直到其中有一方超出边界或者点不为 '*',终止。如果路径长度大于等于d就将路径上的每个点标记值++

最后check ,如果有点为 '*'但标记值为0就说明不符合条件

细节见代码:

//  AC one more times
int cnt, c[100][100],n,m,k;  
char op[100][100];
bool st;
int d;

void search(int x,int y)
{
    int t1x=x,t2x=x,t1y=y,t2y=y;
    while(1)
    {
        int jishu=0;
        t1x=t1x-1,t1y=t1y-1;
        t2x=t2x-1,t2y=t2y+1;
        if(t1x>=0&&t1x<n&&t1y>=0&&t1y<m)
            if(op[t1x][t1y]=='*')
                jishu++;
        if(t2x>=0&&t2x<n&&t2y>=0&&t2y<m)
            if(op[t2x][t2y]=='*')
        
                jishu++;
        if(jishu<2)   break;
        cnt++;
    }

    if(cnt>=k)
    {
        c[x][y]++;
        t1x=t2x=x,t1y=t2y=y;
        while(cnt--)
        {
            t1x=t1x-1,t1y=t1y-1;
            t2x=t2x-1,t2y=t2y+1;
            if(t1x>=0&&t1x<n&&t1y>=0&&t1y<m)
                if(op[t1x][t1y]=='*')
                    c[t1x][t1y]++;
            if(t2x>=0&&t2x<n&&t2y>=0&&t2y<m)
                if(op[t2x][t2y]=='*')
                    c[t2x][t2y]++;
        }
    }
}
void solve()
{
    cin>>n>>m>>k;
    st=false;    memset(c,0,sizeof c);
    for(int i=0;i<n;i++)    cin>>op[i];

    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if( op[i][j]=='*' && 
                ( i-1>=0 && j-1>=0 && j+1<m) ) 
            {

                cnt=0;
                search(i,j);
            }
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(op[i][j]=='*'&&c[i][j]<=0)
                st=true;
            else if(op[i][j]=='.'&&c[i][j]>=1)
                st=true;
    if(st)
        cout<<"NO"<<endl;
    else cout<<"YES"<<endl;
    return;
}

    

    
int main()
{
    std::ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    
    int T;cin>>T;for(int i=1;i<=T;i++)
        solve();    


    return 0;
}

 

本文来自博客园,作者:magicat,转载请注明原文链接:https://www.cnblogs.com/magicat/p/16535726.html

posted on 2022-07-30 20:10  magicat  阅读(59)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3