随笔1

今天下午练的巨拉跨,bfs都看了一个半小时不会写

L3-004 肿瘤诊断 (30 分)

输入格式:

输入第一行给出4个正整数:M、N、L、T,其中M和N是每张切片的尺寸(即每张切片是一个M×N的像素矩阵。最大分辨率是1);L(≤)是切片的张数;T是一个整数阈值(若疑似肿瘤的连通体体积小于T,则该小块忽略不计)。

最后给出L张切片。每张用一个由0和1组成的M×N的矩阵表示,其中1表示疑似肿瘤的像素,0表示正常像素。由于切片厚度可以认为是一个常数,于是我们只要数连通体中1的个数就可以得到体积了。麻烦的是,可能存在多个肿瘤,这时我们只统计那些体积不小于T的。两个像素被认为是“连通的”,如果它们有一个共同的切面,如下图所示,所有6个红色的像素都与蓝色的像素连通。

输出格式:

在一行中输出肿瘤的总体积。

输入样例:

3 4 5 2
1 1 1 1
1 1 1 1
1 1 1 1
0 0 1 1
0 0 1 1
0 0 1 1
1 0 1 1
0 1 0 0
0 0 0 0
1 0 1 1
0 0 0 0
0 0 0 0
0 0 0 1
0 0 0 1
1 0 0 0
 

输出样例:

26


#include <bits/stdc++.h>
using namespace std;
int m,n,l,t;
const int inf=0x3f3f3f3f;
int mp[70][1300][130];
int fx[70][1300][130];
int sum=0;
int maxn=0;
int tt[]= {0,0,0,0,1,-1};
int tx[]= {0,0,-1,1,0,0};
int ty[]= {1,-1,0,0,0,0};
typedef struct {
    int x,y,z;
} node;
void bfs(int z,int x,int y) {
    int kp=0;
    node ps;
    ps.z=z,ps.x=x,ps.y=y;
    queue<node>q;
    q.push(ps);
    fx[z][x][y]=1;
    //cout<<"???"<<endl;
    while(!q.empty()) 
    {
        //    cout<<kp<<endl;
        node uss;
        uss=q.front();
        q.pop();
        kp++;
        for(int i=0; i<6; i++) 
        {
            int ttz=uss.z+tt[i];
            int ttx=uss.x+tx[i];
            int tty=uss.y+ty[i];
            if(ttz>=1&&ttz<=l&&ttx>=1&&ttx<=m&&tty>=1&&tty<=n&&fx[ttz][ttx][tty]==inf&&mp[ttz][ttx][tty]==1) 
            {
            //    kp++;
                node pu;
                pu.z=ttz,pu.x=ttx,pu.y=tty;
                q.push(pu);
                fx[ttz][ttx][tty]=1;
            }
        }
    }
    if(kp>=t) sum+=kp;
//    cout<<sum<<endl;
}
int main() {
    scanf("%d %d %d %d",&m,&n,&l,&t);
    for(int u=1; u<=l; u++) {
        for(int i=1; i<=m; i++) {
            for(int j=1; j<=n; j++) {
                scanf("%d",&mp[u][i][j]);
                fx[u][i][j]=inf;
            }
        }
    }
    for(int u=1; u<=l; u++) {
        for(int i=1; i<=m; i++) {
            for(int j=1; j<=n; j++) {
                if(fx[u][i][j]==inf&&mp[u][i][j]==1) bfs(u,i,j);
            }
        }
    }
    cout<<sum<<endl;
    return 0;
}

自己一直死循环的原因其实就是在pop的问题,pop应该放在循环的外面,放里面之后pop出去其实会有问题,其次就是判断条件写的还是有问题,另外就是记录总数的时候应该把记录数据的放在循环外面,因为判断里面的是判断后的,有一些并不能够具备条件放进去

 

这道题几乎占据了后半场所有的时间,还是需要好好反思一下

 

L1-006 连续因子 (20 point(s))
 

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1)。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630
 

输出样例:

3
5*6*7

题目分析:主要是给定一个数字,然后输出他的因子的最长连续序列

这一题其实不应该做不出来的,但是在写的时候一直害怕超时没有试过,导致本来应该做对的题目没有做对,因此也是非常的可惜

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin>>n;
    int m=sqrt(n);
    int s[m];//存放数组中的数据
    int cnt=0;
    int flag=0;
    int len=1;
    int maxlen=0;
    int pos;
//    memset(s,0,sizeof s);
    for(int i=2; i<=m; i++) 
    {
        if(n%i==0) 
        {
            cnt++;
            s[cnt]=i;
        }
    }
//    for(int i=1;i<=cnt;i++) cout<<s[i]<<endl;
    if(cnt==0) 
    {
        cout<<"1"<<endl;
        cout<<n<<endl;
    } 
    else if(cnt==1) 
    {
        cout<<"1"<<endl;
        cout<<s[cnt]<<endl;
    } 
    else 
    {
        for(int i=1; i<=cnt-1; i++) 
        {
            int sum=s[i];
            for(int j=i; j<=cnt-1; j++) 
            {
                if(n%(sum*s[j+1])==0&&(s[j+1]-s[j])==1) 
                {
                    sum*=s[j+1];
                    len++;
                }
                else
                {
                    break;
                }
            }
            if(len>maxlen)
            {
                maxlen=len;
                pos=i;
            //    cout<<"??"<<endl;
            }
            len=1;
        }
        cout<<maxlen<<endl;
    for(int i=pos;i<=pos+maxlen-1;i++)
    {
        cout<<s[i];
        if(i!=pos+maxlen-1) cout<<"*";
    }
    cout<<endl;
    }
    
    return 0;
}

还有一道应该是01背包并且重现的思路,等下再补

posted @ 2021-03-06 20:54  Treasure-  阅读(41)  评论(0)    收藏  举报