2023年新疆ICPC VP

3h6题619罚时,solo铜,大概rk13 alt B

看了下赛时提交,大部分都是数1的个数判断硬算

其实dfs搜大于2的连通块个数就行,1个是E,5个是Y,其他S

using namespace std;
string a[1000100];
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
int cnt=0,ans=0;
void dfs(int x,int y,int s)
{
    if(s==2) ans++;
    a[x][y]='0';
    for(int i=0;i<4;i++)
    {
        int xx=x+dx[i],yy=y+dy[i];
        if(xx>=0&&yy>=0&&a[xx][yy]=='1')
        {
            dfs(xx,yy,s+1);
        }
    }
}
int main()
{
    while(cin>>a[cnt])
    {
        cnt++;
    }
    for(int i=0;i<cnt;i++)
    {    
        int n=a[i].size();
        for(int j=0;j<n;j++)
        {    
            if(a[i][j]=='1')
            dfs(i,j,1);
        }
    }
    if(ans==1)
        cout<<"E"<<endl;
    else if(ans==5)
        cout<<"Y"<<endl;
    else
        cout<<"S"<<endl;
}

E

简单的模拟,两个map一个存上联出现过的,一个存上联每个数对应的

using namespace std;
#define int long long
int n,a[100100],cnt=1;
map<int,int>s1,s2;
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        s1[a[i]]=1;
    }
    for(int i=0;i<n;i++)
    {
        if(s2[a[i]])
            cout<<s2[a[i]]<<' ';
        else
        {
            for(int i=cnt;;i++)
            {
                if(s1[i]==0)
                {
                    cnt=i;
                    break;
                }
            }
            cout<<cnt<<' ';
            s2[a[i]]=cnt;
            cnt++;
        }
    }
    
}

F

回文只要(i,j)(n-i+1,j)(i,m-j+1)(n-i+1,m-j+1)相等即可 一开始思路错,想把四个位置变相同,wa1发之后发现要讨论重叠情况,直接算四个点不改状态,ans/4即可

using namespace std;
#define int long long
int n,m,ans=0;
char s[1010][1010];
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>s[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            char a=s[i][j];
            char b=s[n-i+1][j];
            char c=s[i][m-j+1];
            char d=s[n-i+1][m-j+1];
            int mi=1145141918;
                for(char k='a';k<='z';k++)
                {
                    int res=0;
                    res+=min(abs(k-a),26-abs(k-a));
                    res+=min(abs(k-b),26-abs(k-b));
                    res+=min(abs(k-c),26-abs(k-c));
                    res+=min(abs(k-d),26-abs(k-d));
                    mi=min(res,mi);
                }
                ans+=mi;
        }
    cout<<ans/4<<endl;
}

H

签到

using namespace std;
#define int long long
int n,a,b;
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>a>>b;
    int xx=((n-a+2)+n)*(a-1)/2+b;
    //cout<<n-a+2<<' '<<xx<<' '<<endl;
    cout<<char(xx%26+'A'-1)<<endl;
}

I

一开始觉得是最小生成树,抄个板子交一发wa,把英文题面拿去翻译一下才读懂,贪心即可

using namespace std;
#define int long long
int sum,res,n,d[200100];
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    cin>>d[i];
    }
    for(int i=1;i<=n;i++)
    {
    int x=min(d[i]-1,(n-1)*2-n-sum);
    res+=(x+1)*i*i;
    sum+=x;
    }
    if(sum<(n-1)*2-n) 
        cout<<-1<<endl;
    else 
        cout<<res<<endl;
}

J

逆天签到,我第一下直接被骗建树,吃两发wa,然后回忆了一下洛谷一道类似的,直接统计入度,C(n,2)即可,(然后没开ll又wa一发。。)

using namespace std;
#define int long long
vector<int>a[100100];
int n,d[100100],ans;
signed main()
{
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int ui,vi;
        cin>>ui>>vi;
        d[ui]++,d[vi]++;
    }
    for(int i=0;i<n;i++)
        ans+=d[i]*(d[i]-1)/2;
    cout<<ans<<endl;
}

因为VP时候有正榜,不会乱开题,一坤h差不多切完6 题了,比去年ccpc5h开一题进步太多了,win

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务