7/22·afternoon

发布时间 2023-07-22 17:00:47作者: 臧清宇

1272:【例9.16】分组背包  http://ybt.ssoier.cn:8088/problem_show.php?pid=1272

#include<bits/stdc++.h>
using namespace std;
struct qwert{
    int w,v;
}a[13][31];
int V,N,T;
int cnt[13],f[203];
int main(){
    cin>>V>>N>>T;
    for(int i=1;i<=N;i++){
        int x_1,x_2,x_3;
        cin>>x_1>>x_2>>x_3;
        a[x_3][++cnt[x_3]].w=x_1;
        a[x_3][cnt[x_3]].v=x_2;
    }
    for(int i=1;i<=T;i++){
        for(int k=V;k>=0;k--){
            for(int j=1;j<=cnt[i];j++){
                if(k>=a[i][j].w)f[k]=max(f[k],f[k-a[i][j].w]+a[i][j].v);
            }
        } 
    }
    cout<<f[V];
    return 0;
}
//100%
//待纠错
#include<bits/stdc++.h> using namespace std; struct qwert{ int w,v; }a[13][31]; int V,N,T; int cnt[13],f[13][203]; int main(){ cin>>V>>N>>T; for(int i=1;i<=N;i++){ int x_1,x_2,x_3; cin>>x_1>>x_2>>x_3; a[x_3][++cnt[x_3]].w=x_1; a[x_3][cnt[x_3]].v=x_2; }cout<<endl; for(int i=1;i<=T;i++){ for(int k=V;k>=0;k--){ for(int j=1;j<=cnt[i];j++){ if(k>=a[i][j].w)f[i][k]=max(f[i-1][k],f[i-1][k-a[i][j].w]+a[i][j].v); else f[i][k]=max(f[i-1][k],f[i][k]); } } for(int o=0;o<=V;o++){ cout<<f[i][o]<<" "; }cout<<endl; } cout<<f[T][V]; return 0; } //f[i][j]->前i组总重在j内的最大价值 //未完成

1329:【例8.2】细胞  http://ybt.ssoier.cn:8088/problem_show.php?pid=1329

#include<bits/stdc++.h>
using namespace std;
struct pos{
    int x,y;
};
int n,m;
int a[203][203];
bool vis[203][203];
int tx[4]={1,0,-1,0};
int ty[4]={0,1,0,-1};
void bfs(int bx,int by){
    queue<pos> q;
    while(!q.empty())q.pop();
    vis[bx][by]=1;
    q.push({bx,by});
    while(!q.empty()){
        pos c=q.front();q.pop();
        for(int i=0;i<4;i++){
            int nx=c.x+tx[i];
            int ny=c.y+ty[i];
            if(nx>0&&nx<=n&&ny>0&&ny<=m&&!vis[nx][ny]&&a[nx][ny]!=0){
                vis[nx][ny]=1;
                q.push({nx,ny});
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            char ch;
            cin>>ch;
            a[i][j]=ch-'0';
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!vis[i][j]&&a[i][j]!=0){
                bfs(i,j);
                sum++;
            }
        }
    }
    cout<<sum;
    return 0;
}

1330:【例8.3】最少步数  http://ybt.ssoier.cn:8088/problem_show.php?pid=1330

#include<bits/stdc++.h>
using namespace std;
struct pos{
    int x,y,s;
};
int n1,n2,m1,m2;
bool vis[103][103];
int tx[12]={2,2,-2,-2,2,2,-2,-2,1,1,-1,-1};
int ty[12]={-2,2,-2,2,1,-1,1,-1,2,-2,2,-2};
void bfs(int bx,int by){
    queue<pos> q;
    memset(vis,0,sizeof(vis));
    while(!q.empty())q.pop();
    vis[bx][by]=1;
    q.push({bx,by,0});
    while(!q.empty()){
        pos c=q.front();q.pop();
        if(c.x==1&&c.y==1){
            cout<<c.s<<endl;
            break;
        }
        for(int i=0;i<12;i++){
            int nx=c.x+tx[i];
            int ny=c.y+ty[i];
            if(nx>0&&nx<=100&&ny>0&&ny<=100&&!vis[nx][ny]){
                vis[nx][ny]=1;
                q.push({nx,ny,c.s+1});
            }
        }
    }
}
int main(){
    cin>>n1>>n2>>m1>>m2;
    bfs(n1,n2);
    bfs(m1,m2);
    return 0;
}