随笔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背包并且重现的思路,等下再补

浙公网安备 33010602011771号