SMU Summer 2024 Contest Round 6

1.Tak and Cards

原题链接:http://162.14.124.219/contest/1010/problem/B

设dp[i][j][k]是在前i个数中选j(j>=1)个数、其和为k的方案总数。第i个数有选与不选2种可能,由此得出转移方程dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k-a[i]](j>=1)

查看代码

#include <bits/stdc++.h>
#define int long long
using namespace  std;
int a[1000000],dp[60][60][3600];
signed main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            for(int k=0;k<=n*m;k++)
            {
                if(i==0&&j==0&&k==0)dp[i][j][k]=1;
                else if(i>=1&&k<a[i])dp[i][j][k]=dp[i-1][j][k];
                else if(i>=1&&j>=1&&k>=a[i])dp[i][j][k]=dp[i-1][j][k]+dp[i-1][j-1][k-a[i]];
                else dp[i][j][k]=0;
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
        ans+=dp[n][i][i*m];
    cout<<ans;
    return 0;
}

2.Coloring Edges on Tree

原题链接:http://162.14.124.219/contest/1010/problem/D

先构造邻接表,再从度数最大的点dfs图涂色

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
const int mod=1e9+7;
vector<PII> g[1000000];
int du[1000000];
int tu[1000000];
void dfs(int x,int y)
{
    int co=1;
    for(int i=0;i<g[x].size();i++)
    {
        int a=g[x][i].first,b=g[x][i].second;
        if(b==y)continue;
        if(tu[y]==co)co++;
        tu[b]=co++;
        dfs(a,b);
    }
}
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        g[x].push_back({y,i});
        g[y].push_back({x,i});
        du[x]++;
        du[y]++;
    }
    int ma=0;
    for(int i=1;i<=n;i++)
    {
        ma=max(ma,du[i]);
    }
    cout<<ma<<endl;
    dfs(ma,0);
    for(int i=1;i<n;i++)
        cout<<tu[i]<<endl;
    return 0;
}

3.Nearest Excluded Points

原题链接:http://162.14.124.219/contest/1010/problem/F

将所有在已知点周围的空点记录下来BFS,遇到未被更新且已知点就加入队列,否则不加入,可以用map存图

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int n;
int x[1000000],y[1000000];
int sx[1000000],sy[1000000];
bool vis[1000000];
map<int,map<int,int>> mp;
queue<int> q;
void bfs()
{
    for(int i=1;i<=n;i++)
        for(int j=0;j<4;j++)
            if(!mp[x[i]+dx[j]][y[i]+dy[j]]){
                sx[i]=x[i]+dx[j];
                sy[i]=y[i]+dy[j];
                vis[i]=true;
                q.push(i);
            }
    while(!q.empty()){
        int p=q.front();
        q.pop();
        for(int i=0;i<4;i++)
            if(mp[x[p]+dx[i]][y[p]+dy[i]]){
                int k=mp[x[p]+dx[i]][y[p]+dy[i]];
                if(!vis[k]){
                    sx[k]=sx[p];
                    sy[k]=sy[p];
                    vis[k]=true;
                    q.push(k);
                }
            }
    }
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x[i]>>y[i];
        mp[x[i]][y[i]]=i;
    }
    bfs();
    for(int i=1;i<=n;i++)
        cout<<sx[i]<<" "<<sy[i]<<endl;
    return 0;
}
posted @ 2024-07-23 10:06  伊芙加登  阅读(8)  评论(0)    收藏  举报