F,妈妈找小蝌蚪
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
青蛙妈妈最近很不放心把蝌蚪宝宝送到幼儿园,但当她买菜回家时,却发现可爱的孩子小蝌蚪走丢了。
小池塘里有很多石头,青蛙家在其中标号为s的石头上。小蝌蚪会移动k分钟,每分钟会出现在任意石头旁边,甚至多次出现在一块石头旁边。但k分钟之后,蝌蚪宝宝就游不动了。
青蛙妈妈第0秒从家所在的石头出发,每分钟移动一次,可以留在原地,也可以跳跃到一块当前可跳跃到的石头上(只能在特定的石头间双向跳跃)。
小池塘里有很多石头,青蛙家在其中标号为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
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
萌萌哒栗酱终于来到了迎新赛预赛,可是开考前她发现自己居然忘记了自己的登陆密码!
已知他的密码由3个各不相同的个位数字组成,且是这3个数字所能组成的最大三位数。
冰雪聪明的栗酱掰遍了她的10根脚趾都没能算出密码,离开考没几分钟了,所以希望你能帮助她得到答案。
已知他的密码由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
空间限制: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≤6000≤ai≤10 41≤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;
}
有问题欢迎私聊评论~ 么么哒~