iwtgm-31

题目链接

A.

int a[5];
void solve() {
    int ma=0;
    for(int i=1;i<=3;i++){
        cin>>a[i];
        a[i]=(a[i]+1)/2;
        ma=max(ma,a[i]);
    }
    int ans=0;
    for(int i=1;i<=3;i++){
        if(a[i]==ma){
            ans=(ma-1)*3+i-1+30;
        }
    }
    cout<<ans;
}

B.

map<pair<int,char>,int>hang,lie;
char g[105][105];
void solve() {
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
            hang[{i,g[i][j]}]++;
            lie[{j,g[i][j]}]++;
        }
    }
    string ans="";
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(hang[{i,g[i][j]}]>=2||lie[{j,g[i][j]}]>=2)continue;
            ans+=g[i][j];
        }
    }
    cout<<ans;
}

C.

该题证明,还是要手动模拟
发现奇数位和偶数位的变化一致
n是偶数加减相同无贡献
奇数时,奇数位都-1,偶数位都+1,贡献位1
LL WA一发

void solve() {
    int n,m,k;cin>>n>>m>>k;
    int mi=inf;
    for(int i=1,x;i<=n;i++){
        cin>>x;
        if(i&1)mi=min(mi,x);
    }
    if(n%2==0){
        cout<<"0";return ;
    }
    int ans=min(m/((n+1)/2)*k,mi);
    cout<<ans;
}

E.

爆搜会t,考虑对空白格进行优化
即记录该点上下左右的点
题解取名十字链表,实在没必要取这么高大上的名字

char s[5010][5010];
int U[5050],D[5050],L[5050],R[5050];
int n,m;
void init(){
    for(int i=0;i<n;i++){
        int l=-1;
        for(int j=0;j<m;j++){
            if(s[i][j]!='.'){
                int now=i*m+j;
                L[now]=l;
                if(l!=-1)R[l]=now;
                l=now;
            }
        }
        R[l]=-1;
    }
    for(int i=0;i<m;i++){
        int l=-1;
        for(int j=0;j<n;j++){
            if(s[j][i]!='.'){
                int now=j*m+i;
                U[now]=l;
                if(l!=-1)D[l]=now;
                l=now;
            }
        }
        D[l]=-1;
    }
}
int dfs(int x,int y){
    int now=x*m+y;
    if(U[now]!=-1)D[U[now]]=D[now];
    if(D[now]!=-1)U[D[now]]=U[now];
    if(L[now]!=-1)R[L[now]]=R[now];
    if(R[now]!=-1)L[R[now]]=L[now];
    int go;
    if(s[x][y]=='U')go=U[now];
    else if(s[x][y]=='D')go=D[now];
    else if(s[x][y]=='L')go=L[now];
    else if(s[x][y]=='R')go=R[now];
    if(go==-1)return 1;
    return dfs(go/m,go%m)+1;
 
}
void solve() {
    int ans=-1,num=0;
    cin>>n>>m;
    for(int i=0;i<n;i++)scanf("%s",s[i]);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(s[i][j]!='.'){
                init();
                int now=dfs(i,j);
                if(now>ans)ans=now,num=1;
                else if(now==ans)++num;
            }
        }
    }
    cout<<ans<<' '<<num;
}
posted @ 2023-11-27 21:28  WW爆米花  阅读(4)  评论(0编辑  收藏  举报