2016年团体程序设计天梯赛-模拟赛

本文介绍了两种算法:一是实现多个分数相加并简化结果;二是通过前序和中序遍历构建二叉树,并输出后序遍历结果。涉及算法设计、数据结构应用及数学运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

L1-1. N个数求和

/* ***********************************************
Author        :Maltub
Email         :xiang578@foxmail.com
Blog          :htttp://www.xiang578.com
************************************************ */

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
//#include <bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define pb push_back
using namespace std;
typedef vector<int> VI;
typedef long long ll;
const ll mod=1000000007;
const int N=2048;

int main()
{
    int n;
    ll t,ta,a1,tmp;
    ll a[120],b[120];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%lld/%lld",&a[i],&b[i]);
    }
    if(n>=1)
    {
        t=b[0];
        for(int i=1;i<n;i++)
            t=t*b[i]/__gcd(b[i],t);
        ta=0;
        for(int i=0;i<n;i++)
        {
            ta+=t/b[i]*a[i];
        }
    }
    a1=ta/t;
    ta=ta%t;
    tmp=__gcd(abs(ta),abs(t));
    ta/=tmp;
    t/=tmp;
    if(ta<0&&a1!=0) {ta=-ta;}
    if(a1==0&&ta!=0)
    {
        printf("%lld/%lld\n",ta,t);
    }
    else if(ta==0)
    {
        printf("%lld\n",a1);
    }
    else
    {
        printf("%lld %lld/%lld\n",a1,ta,t);
    }
    return 0;
}

L2-2. 树的遍历

/* ***********************************************
Author        :Maltub
Email         :xiang578@foxmail.com
Blog          :htttp://www.xiang578.top
************************************************ */

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
//#include <bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define pb push_back
using namespace std;
typedef vector<int> VI;
typedef long long ll;
const ll mod=1000000007;
const int N=2048;
struct node {
    int n;
    int l,r;
} p[N];
int n,a[50],b[50],tot;
vector<int>v;

int build(int l,int r,int l2,int r2) {
    if(l>r||l2>r2) return -1;
    int i,t,now;
    now=tot;
    tot++;
    p[now].n=a[r2];
    p[now].l=p[now].r=-1;
    if(l==r) return now;
    for(i=l; i<=r; i++) {
        if(b[i]==a[r2]) break;
    }
    t=i-l;
    p[now].l=build(l,i-1,l2,l2+t-1);
    p[now].r=build(i+1,r,l2+t,r2-1);
    return now;
}

int main() {
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n,rt,t;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
        scanf("%d",&a[i]);
    for(int i=0; i<n; i++)
        scanf("%d",&b[i]);
    tot=0;
    build(0,n-1,0,n-1);
    queue<int>q;
    v.clear();
    q.push(0);
    while(!q.empty()) {
        t=q.front();
        q.pop();
        v.push_back(p[t].n);
        if(p[t].l!=-1) q.push(p[t].l);
        if(p[t].r!=-1) q.push(p[t].r);
    }
    for(int i=0; i<v.size(); i++) {
        if(i) printf(" ");
        printf("%d",v[i]);
    }
    printf("\n");
    return 0;
}

 L3-004. 肿瘤诊断

#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int dx[]= {1,-1,0,0,0,0};
int dy[]= {0,0,1,-1,0,0};
int dz[]= {0,0,0,0,1,-1};
int u[70][1300][130];
int a[70][1300][130];
struct node {
    int x,y,z;
} p,w;
int m,n,l;

int bfs(int x,int y,int z) {
    int num=0;
    queue<node>q;
    p.x=x;
    p.y=y;
    p.z=z;
    q.push(p);
    while(!q.empty()) {
        w=q.front();
        num++;
        q.pop();
        for(int i=0; i<6; i++) {
            p.x=w.x+dx[i];
            p.y=w.y+dy[i];
            p.z=w.z+dz[i];
            if(p.x<0||p.x>=l||p.y<0||p.y>=m||p.z<0||p.z>=n) continue;
            if(u[p.x][p.y][p.z]==1||a[p.x][p.y][p.z]==0) continue;
            u[p.x][p.y][p.z]=1;
            q.push(p);
        }
    }
    return num;
}
int main() {
    int t,ans;
    scanf("%d%d%d%d",&m,&n,&l,&t);
    for(int i=0; i<l; i++)
        for(int j=0; j<m; j++)
            for(int k=0; k<n; k++)
                scanf("%d",&a[i][j][k]);
    memset(u,0,sizeof(u));
    ans=0;
    for(int i=0; i<l; i++)
        for(int j=0; j<m; j++)
            for(int k=0; k<n; k++) {
                if(u[i][j][k]==0&&a[i][j][k]==1) {
                    //printf("%d %d %d\n",i,j,k);
                    u[i][j][k]=1;
                    int num=bfs(i,j,k);
                    if(num>=t)
                        ans+=num;
                    //printf("  %d\n",num);
                }
            }
    printf("%d\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值