CodeCraft-20 (Div. 2)

自从上紫后打的四场四连跪,总共掉了200分,开始怀疑人生。

昨天晚上5点打组队赛,然后10点半打cf,当时就比较困了,但这div2过了2题也太说不过去了,跟上一场犯的错误一模一样,当C做不出来就死磕,应该果断点放弃的,D题明显是个简单题,最后又因为没有时间而敲不完。


A - Grade Allocation

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100050;
int a[maxn];
int main()
{
    int n,t,m;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        int sum=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        int ans=min(sum,m);
        printf("%d\n",ans);
    }
    return 0;
}

B - String Modification

题解:

对与i,最后形成的字符串是(i,末尾)+ A.A为字符串(1,i-1),当字符串长度和i的奇偶性相同时A需要反转。

这样每个i的字符串就得到了,然后n^2的比较大小就行。

比赛的时候写复杂了,字符串应该是可以直接比较的,不需要自己写比较,直接维护字典序最小的字符串即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5050;
char s[maxn];
char a[maxn][maxn];
int vis[maxn];
int main()
{
    int n,t,m;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        scanf("%s",s+1);
        int flag=0;
        for(int i=1;i<=n;i++){
            int cnt=0;
            for(int j=i;j<=n;j++) a[i][++cnt]=s[j];
            int f=(n%2)^(i%2);
            //printf("%d!\n",f);
            if(f){
 
                for(int j=1;j<i;j++) a[i][++cnt]=s[j];
            }
            else for(int j=i-1;j>=1;j--) a[i][++cnt]=s[j];
            vis[i]=0;
        }
        int id;
        for(int j=1;j<=n;j++){
            char mi='z';
            int num=0;
            for(int i=1;i<=n;i++){
                if(vis[i]) continue;
                if(a[i][j]<mi){
                    mi=a[i][j];
                    num=1;
                    id=i;
                }
                else if(a[i][j]==mi) num++;
            }
            if(num==1){
                flag=1;
                for(int i=1;i<=n;i++) printf("%c",a[id][i]);
                printf("\n%d\n",id);
                break;
            }
            else{
                for(int i=1;i<=n;i++){
                if(vis[i]) continue;
                    if(a[i][j]>mi) vis[i]=1;
                }
            }
        }
        if(!flag){
            for(int j=1;j<=n;j++) printf("%c",a[id][j]);
                printf("\n%d\n",id);
        }
    }
    return 0;
}

C - Primitive Primes

题意:给出两个多项式a,b的系数,两个多项式相乘后的多项式为c,求任意一个下标t,该位置的系数不能被p整除

题解:

设t=i+j,i为a[]第一个不被p整除的下标,j为b[]第一个不被p整除的下标

t位置的系数=a[0]*b[i+j]+a[1]*b[i+j-1]...a[i]*b[j]...a[i+j]*b[0]

a[0]到a[i-1]每一个都能被p整除,b[0]到b[j-1]每一个都能被p整除

所以上面的式子只有a[i]*b[j]这个式子不被p整除,其他都是p的倍数,去掉即可

这样最后系数=a[i]*b[j],这一定不能被p整除

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
inline int read()
{
  register int X=0;
  register char ch=0;
  while(ch<48||ch>57)ch=getchar();
  while(ch>=48&&ch<=57)X=X*10+(ch^48),ch=getchar();
  return X;
}
int a[maxn],b[maxn];
int main()
{
    ll n,m,p;
    scanf("%lld%lld%lld",&n,&m,&p);
    for (int i=0;i<n;i++)a[i]=read();
    for (int i=0;i<m;i++)b[i]=read();
    int x=-1,y=-1;
    for(int i=0;i<n;i++){
        if(a[i]%p!=0){
            x=i;
            break;
        }
    }
    for(int i=0;i<m;i++){
        if(b[i]%p!=0){
            y=i;
            break;
        }
    }
    printf("%d\n",x+y);
    return 0;
}

D - Nash Matrix

题意:

n*n的矩阵,每个单元mp[][]是L,R,U,D,X中的一种,分别代表往左,右,上下走,不动。输入a[][]的矩阵代表每个单元,从该单元开始到某个单元结束停止不动的坐标。(-1,-1),代表从该单元走陷入了死循环。给你a[][]矩阵,让你反推mp[][]看是否存在

题解:

分类讨论

1)不是陷入死循环的单元。当每个单元的坐标等于该单元终点的坐标时,将该单元放入队列,然后从该单元反推开始bfs()

2)陷入死循环的单元。不需要从开头一直走,一直走,再走回开头。只需要让该单元与相邻也是(-1,-1)的单元这两个单元陷入死循环即可,然后bfs2()让其他(-1,-1)的点走到这两个单元就行

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1050;
struct node{
    int x,y;
}a[maxn][maxn];
int vis[maxn][maxn],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}},n;
char mp[maxn][maxn];
char d1[10]="RDLU",di[10]="LURD";
int solve(node x){
    return ((a[x.x][x.y].x-1)*n+a[x.x][x.y].y);
}
queue<node>q;
node v;
void bfs(){
    while(!q.empty()){
        node u=q.front();q.pop();
        for(int i=0;i<4;i++){
            v.x=u.x+dir[i][0];v.y=u.y+dir[i][1];
            if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x==-1) continue;
            if(solve(v)==vis[u.x][u.y]){
                vis[v.x][v.y]=solve(v);
                mp[v.x][v.y]=di[i];
                q.push(v);
            }
        }
    }
}
void bfs2(){
    while(!q.empty()){
        node u=q.front();q.pop();
        for(int i=0;i<4;i++){
            v.x=u.x+dir[i][0];v.y=u.y+dir[i][1];
            if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x!=-1) continue;
            vis[v.x][v.y]=1;
            mp[v.x][v.y]=di[i];
            q.push(v);
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%d%d",&a[i][j].x,&a[i][j].y);
            if(a[i][j].x==i&&a[i][j].y==j){
                vis[i][j]=(i-1)*n+j;
                q.push(a[i][j]);
                mp[i][j]='X';
            }
        }
    }
    bfs();
    int flag=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(a[i][j].x!=-1||vis[i][j]) continue;
            int num=0;
            for(int ii=0;ii<4;ii++){
                v.x=i+dir[ii][0];v.y=j+dir[ii][1];
                if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x!=-1) continue;
                vis[v.x][v.y]=1;vis[i][j]=1;
                mp[i][j]=d1[ii];mp[v.x][v.y]=di[ii];
                q.push(v);
                v.x=i;v.y=j;q.push(v);
                num=1;
                break;
            }
            if(!num){
                flag=1;
                break;
            }
            bfs2();
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(vis[i][j]==0){
                flag=1;
                break;
            }
        }
    }
    if(flag){
        printf("INVALID\n");
        return 0;
    }
    printf("VALID\n");
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf("%c",mp[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值