$9.5$ 短学期题解

发布时间 2023-09-04 21:13:26作者: EdGrass

\(a\)

一个简单的坐标转换,原来的 \(a[i][j]\) 会变为 \(b[j][n-i+1]\)

int b[N][N];
void solve(){
    int n=read(),m=read();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            b[j][n-i+1]=read();
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<b[i][j]<<' ';
        }
        cout<<'\n';
    }
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(b\)

判闰年+月份年份的进位

int md[20]={0,31,28,31,30,31,30,31,31,30,31,30,31};
void solve(){
    int y,m,d;
    while(cin>>y>>m>>d){
        for(int i=1;i<=10000;i++){
            int runnian=0;
            if((y%4==0&&y%100!=0)||y%400==0)runnian=1;
            d++;
            int mth=md[m];
            if(m==2&&runnian)mth++;
            if(d>mth)d=1,m++;
            if(m>12)y++,m=1;
        }
        cout<<y<<'-'<<m<<"-"<<d<<'\n';
    }
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(c\)

去年的 \(c\) 语言课程题目,我这里暴力枚举了 \(5000\) 次,如果溢出了就把最后一次多滴的去掉。

void solve(){
    int vul,d;
    while(cin>>vul>>d){
        int sum=0,pause=0;
        for(int i=1;i<=5000;i++){
            sum+=i;
            if(sum*d>=vul){
                int more=(sum*d-vul)/d;
                pause-=more;
                break;
            }
            pause++;
        }
        cout<<sum+pause<<'\n';
    }
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(d\)

首先每年的牛一定可以继承上一年的数量(因为牛不会死),然后再加上三年前的牛的数量(因为他们会生)。

int f[N];
void solve(){
    int n=read();
    f[1]=1;
    for(int i=2;i<=n;i++){
        f[i]=f[i-1];
        if(i-3>=0)f[i]+=f[i-3];
        
    }
    cout<<f[n]<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(e\)

简单加法

void solve(){
    int n=read();
    int g=0,s=0,b=0;
    for(int i=1;i<=n;i++){
        int x=read(),y=read(),z=read();
        g+=x;
        s+=y;
        b+=z;
    }
    cout<<g<<" "<<s<<" "<<b<<" "<<g+s+b<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(f\)

使用邻接矩阵存图,然后 \(dfs\) 暴力枚举。

int lj[N][N],vis[N],a[N],n;
int ans=0;
void dfs(int now,int w){
    ans=max(ans,w);
    for(int i=1;i<=n;i++){
        if(!vis[i]&&lj[now][i]){
            vis[i]=1;
            dfs(i,w+a[i]);
            vis[i]=0;
        }
    }
}
void solve(){
    n=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    for(int i=1;i<=n-1;i++){
        for(int j=i+1;j<=n;j++){
            int x=read();
            lj[i][j]=x;
            lj[j][i]=x;        
        }
    }
    for(int i=1;i<=n;i++){
        vis[i]=1;
        dfs(i,a[i]);
        vis[i]=0;
    }
    cout<<ans<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}