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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章