浙江工业大学大学生程序设计迎新赛预赛( F,小妈妈找蝌蚪 L ,取数游戏 M,小杰的签到题)

 
    

F,妈妈找小蝌蚪

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述 

        青蛙妈妈最近很不放心把蝌蚪宝宝送到幼儿园,但当她买菜回家时,却发现可爱的孩子小蝌蚪走丢了。
        小池塘里有很多石头,青蛙家在其中标号为s的石头上。小蝌蚪会移动k分钟,每分钟会出现在任意石头旁边,甚至多次出现在一块石头旁边。但k分钟之后,蝌蚪宝宝就游不动了。
        青蛙妈妈第0秒从家所在的石头出发,每分钟移动一次,可以留在原地,也可以跳跃到一块当前可跳跃到的石头上(只能在特定的石头间双向跳跃)。

输入描述:

  
  
多组数据。
第一行输入石头个数n,青蛙妈妈可以跳跃的石头对数m,蝌蚪宝宝的活动时间k,青蛙家所在的石头s。
之后输入k个数,其中第i个数代表第i分钟蝌蚪宝宝的位置,编号从i=1开始。 接下来输入m行,每行包括两个数ui,vi,表示青蛙妈妈可以在第ui个和vi个石头间双向跳跃。

输出描述:

请输出青蛙妈妈最少几分钟发现蝌蚪宝宝。
示例1

输入

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

输出

1
3

备注:

1≤n≤100000,
1≤m≤2∗n,
1≤k≤100000,
1≤s≤n,
1≤u,v≤n,
无重边,无自环,保证联通,
数据不多于10组
代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> vec[100020];
queue<int> Q;
int l[100020];
int ke[100020];
int n,m,k,s;
int main()
{
    while(~scanf("%d",&n))
    {
    scanf("%d%d%d",&m,&k,&s);
    for(int i=1;i<=k;i++)
        scanf("%d",&ke[i]);
    for(int i=0;i<=n;i++)
    {
        l[i]=0;
        vec[i].clear();
    }
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        vec[u].push_back(v);
        vec[v].push_back(u);
    }
    int root;
    Q.push(s);
    while(!Q.empty())
    {
        root=Q.front();
        Q.pop();
        for(int i=0;i<vec[root].size();i++)
        {
            if(l[vec[root][i]]==0&&vec[root][i]!=s)
            {
                l[vec[root][i]]=l[root]+1;
                Q.push(vec[root][i]);
            }
        }
    }
    int min=999999;
    for(int i=1;i<=k;i++)
    {
        if(l[ke[i]]<=i)
        {
            if(i<min) min=i;
        }
    }
    if(min==999999) min=l[ke[k]];
    printf("%d\n",min);
    }
    return 0;
}


L,取数游戏

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述 

萌萌哒栗酱终于来到了迎新赛预赛,可是开考前她发现自己居然忘记了自己的登陆密码!
已知他的密码由3个各不相同的个位数字组成,且是这3个数字所能组成的最大三位数。
冰雪聪明的栗酱掰遍了她的10根脚趾都没能算出密码,离开考没几分钟了,所以希望你能帮助她得到答案。

输入描述:

第一行一个数T,表示有T组数据。
对于每组数据,
输入一行3个数字a,b,c
数字间用空格隔开。

输出描述:

对于每组数据,输出所能组成的最大三位数。
示例1

输入

2
0 2 5
2 1 3

输出

520
321

备注:

T≤100,
0≤a,b,c≤9,
数据保证a,b,c各不相同
代码:
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int T;
int ans[105];
int arr[3];
int sort(int a,int b,int c)
{
    arr[0]=a;
    arr[1]=b;
    arr[2]=c;
    for(int i=0;i<3;i++)
    {
        for(int j=i;j<3;j++)
        {
            if(arr[j]>arr[i])
            {
                int temp;
                temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
            }
        }
    }
    return (arr[0]*100+arr[1]*10+arr[2]);
}
int main()
{
    int t=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&a,&b,&c);
        ans[t++]=sort(a,b,c);
    }
    for(int i=0;i<t;i++)
    {
        printf("%d\n",ans[i]);
    }
    return 0;
}


M,小杰的签到题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述 

小杰组织了一场比赛,在比赛前需要安排队伍签到,但他不确定签到要花多久时间,现在他来请求你的帮助。已知签到是在一个体育馆,该体育馆布置有三个桌子以供不同队伍的队伍同时签到,一个桌子最多只能有一支队伍签到,一支队伍只需在一张桌子前完成签到即可。如果三个桌子都有队伍在签到,其它需要签到的队伍就需要在任意一个桌子前排队,等待签到。

我们假设在t=0的时刻开始接受签到,n支队伍分别在a 1,a 2,...,a n时刻到达体育馆,每支队伍完成签到均需b的时间,为使问题简单,我们忽略体育馆中移动的时间。你需要告诉小杰最早什么时刻,所有的队伍均签到完成。




输入描述:

多组读入。
输入数据的第一行是一个整数T,表示数据的组数。
每组数据的第一行是一个整数n,表示签到的队伍数。
接下来一行有n个整数ai,表示第i支队抵达体育馆的时间。
每组的最后一行是一个整数b,表示一支队伍完成签到的时间。

输出描述:

对于每组数据,输出最后一支队伍最早签到完成的时刻。
示例1

输入

2
5
1 2 4 5 7
4
7
4 4 4 2 8 9 11
5

输出

11
17

备注:

    
    
1≤n≤600
0≤ai≤10 4
1≤b≤1500
数据不超过250组
#include<bits/stdc++.h>
using namespace std;
int T,n;
int b;
int c[3]={0,0,0};
int temp,number;
struct A
{
    int start;
    int end;
}arr[605],t;
int max(int x,int y)
{
    if(x>=y)return x;
    else return y;
}
void min()
{
    temp=c[0];
    number=0;
    for(int i=1;i<3;i++)
    {
        if(c[i]<temp)
        {
            temp=c[i];
            number=i;
        }
    }
}
void sort()
{
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            if(arr[j].start<arr[i].start)
            {
                t=arr[j];
                arr[j]=arr[i];
                arr[i]=t;
            }
        }
    }
}
int main()
{
    int ma;
    scanf("%d",&T);
    while(T--)
    {
        memset(c,0,sizeof(c));
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&arr[i].start);
        }
        scanf("%d",&b);
        sort();
        for(int i=0;i<n;i++)
        {
            min();
            ma=max(c[number],arr[i].start);
            c[number]=ma+b;
            arr[i].end=c[number];
        }
        printf("%d\n",arr[n-1].end);
    }
    return 0;
}
有问题欢迎私聊评论~ 么么哒~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值