T71766 巨噬细胞
题目背景
巨噬细胞属免疫细胞,有多种功能,是研究细胞吞噬、细胞免疫和分子免疫学的重要对象。巨噬细胞容易获得,便于培养,并可进行纯化。巨噬细胞属不繁殖细胞群,在条件适宜下可生活2-3周,多用做原代培养,难以长期生存。
巨噬细胞是一种位于组织内的白血球,源自单核细胞,而单核细胞又来源于骨髓中的前体细胞。巨噬细胞和单核细胞皆为吞噬细胞,在脊椎动物体内参与非特异性防卫(先天性免疫)和特异性防卫(细胞免疫)。它们的主要功能是以固定细胞或游离细胞的形式对细胞残片及病原体进行噬菌作用(即吞噬以及消化),并激活淋巴球或其他免疫细胞,令其对病原体作出反应。
题目描述
巨噬细胞需要打扫身体里的病原体和细胞残片,现在身体中有n个房间(编号为1~N),巨噬细胞在其中编号为k的房间刚刚打扫结束。房间之间有一些道路供巨噬细胞移动,请问巨噬细胞到其他的细胞最少要经过多少个房间呢?
输入输出格式
输入格式:
输入包括两行,第一行为三个整数n,k,m,分别表示房间的个数、巨噬细胞所在的房间、以及道路的条数。
接下来m行每行包括两个整数u,v分别表示,分别表示每条道路的起点和终点。
输出格式:
输出包括一行,包括n个空格隔开的整数,分别表示到每一个房间最少路过的房间数,如果某个房间无法到达,那个房间对应位置输出−1
输入输出样例
输入样例#1:
10 3 12
1 2
2 3
3 4
3 7
4 7
7 9
9 10
4 8
4 5
1 5
1 6
6 5
输出样例#1:
1 0 0 0 1 2 0 1 1 2
说明
输出为要经过的房间的数量,不包括起点房间和终点房间,每条道路都是双向的。
1<=n<=1000,
1<=m<=n∗n。
一开始因为代码顺序的问题,在没有读入n之前就使用了n,造成了后面的错误。下次一定要注意层次和顺序
注意要给给出的路径设一个距离为1,因为房屋的数目比路径少1,所以最后再减去1。
还要注意一种情况,从自身到自身的情况不用减去1,进行特判,输出0.
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int ma[1005][1005];
int dis[1005];
int vis[1005];
int n,k,m,kk;
void Dijk()//迪杰斯特拉模板
{
for(int i=0;i<n-1;i++)//遍历除了n本身以外的n-1个城市
{
int min=inf,kk;//用来存储最小的且没被松弛过的城市
for(int j=1;j<=n;j++)
{
if(min>dis[j]&&!vis[j]) //依次比较
{
min=dis[j];
kk=j;//记录最小且没被松弛过的城市的下标
}
}
vis[kk]=1;//标记被松弛过的城市
for(int h=1;h<=n;h++)
{
if(dis[h]>dis[kk]+ma[kk][h])
dis[h]=dis[kk]+ma[kk][h];
}
}
}
int main()
{
bool flag=0;
scanf("%d%d%d",&n,&k,&m);
memset(ma,inf,sizeof(ma));
for(int i=1;i<=n;i++)
ma[i][i]=0;
memset(vis,0,sizeof(vis));
vis[k]=1;
int a,b;
for(int i=0;i<m;i++)//读入各个屋子间的距离
{
scanf("%d%d",&a,&b);
ma[a][b]=ma[b][a]=1;
}
for(int i=1;i<=n;i++)//初始化dis数组
{
dis[i]=ma[k][i];
}
Dijk();
for(int i=1;i<=n;i++)
{
if(i==k)
printf("0 ");
else if(dis[i]!=inf)
printf("%d ",dis[i]-1);
else
printf("-1 ");
}
return 0;
}
T77091 木棍?林昆
题目描述
现在平面上有n条平行的木棍,选取其中m条木棍使得得这m条木棍两两没有重合部分,请你求出m的最大值。
输入输出格式
输入格式:
第一行为一个正整数n,表示木棍的条数 在接下来的n行中,每行有2个数 ai,bi,表示线段的左端点和右端点的x值。
输出格式:
输出一个整数,表示m的最大值。
输入输出样例
输入样例#1:
3
0 2
2 4
1 3
输出样例#1:
2
说明
1 <= n <= 10^6,
0<ai,bi<=10^6
一道很经典的贪心题
按照木棍的右端进行排序,每次均选右端最小的木棍。
并用一个end变量来记录上一个木棍的右端。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef pair<int,int>P;
P arr[N];
bool cmp(P a,P b)
{
return a.second<b.second;
}
int main()
{
int n,ans=0;
int end=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&(arr[i].first),&(arr[i].second));
sort(arr,arr+n,cmp);
for(int i=0;i<n;i++)
{
if(end<=arr[i].first)
{
end=arr[i].second;
ans++;
}
}
printf("%d\n",ans);
return 0;
}
T77092 玩什么石头 尼姆博弈
题目背景
MJJ喜欢玩石子游戏,两个人玩,现在MJJ准备了n堆石子,每堆有mi个,轮流进行,每次可以任意选择一堆取走一个或多个石子,谁先不能取谁输。
题目描述
MJJ喜欢先手取石头,现在给你每堆石头的数目,请你判断,如果MJJ赢则输出"Yes",否则输出"No"。(输出不带引号)
输入输出格式
输入格式:
多组数据,第一行一个正整数T,表示数据组数。
每组数据:
第一行一个n,k表示一共有n堆石子以及接下来MJJ试图从第k堆开始取 从第二行开始,每隔一个空格一个第i堆石子的数量mi。
输出格式:
输出"Yes"或"No",表示MJJ从第k堆开始取是否可以获得胜利。
输入输出样例
输入样例#1:
2
3 2
1 2 3
2 1
2 1
输出样例#1:
No
Yes
说明
1<= T <= 10^3
1<= n <=10^5
0 <= ai <=10^9
题解:https://blog.csdn.net/weixin_43772166/article/details/89482982
T77093 求阶乘
题目描述
我们知道阶乘的计算公式,比如5!=5∗4∗3∗2∗1=120,现在给你一个n,请你求出n!,因为答案可能很大,所以你只需要输出n! 对 10^9+7取模即可。
输入输出格式
输入格式:
第一行,一个整数T,表示样例个数 接下来T行 每行输入一个整数n
输出格式:
输出有T行,每一行输出n!取模的结果。
输入输出样例
输入样例#1:
2
0
1000000000
输出样例#1:
1
698611116
说明
1<=T<=10^5
0<=N<=10^9
T77094 日期,签到
题目描述
现在给你两个日期,格式为"yyyy-mm-dd",请你求出两个日期之间相差多少天。
输入输出格式
输入格式:
输入有两行,每行一个日期,格式如上。
输出格式:
输出他们相差多少天。
输入输出样例
输入样例#1:
2011-04-12
2011-04-22
输出样例#1:
11
说明
年份保证在4位数以内。