酷暑一夏1

不忘初心,方得始终


牛客练习赛9 A,B,D 题解

A

题目

珂朵莉想每天都给威廉送礼物,于是她准备了n个自己的本子
她想送最多的天数,使得每天至少送一个本子,但是相邻两天送的本子个数不能相同
珂朵莉最多送几天礼物呢

题解

很明显,符合要求的最小整数有1和2,只要1,2,1,2,1,2,…这样算下去就好了

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<cstdio>
int now,n,cnt;
int main()
{
scanf("%d",&n);
cnt=n/3;
n-=cnt*3;
cnt*=2;
// printf("[%d]",n);
while(1)
{
if(n-now-1<0) break;
n-=now+1;
cnt++;
now=!now;
}
printf("%d",cnt);
}

B

题目

珂朵莉给你一个有根树,求有多少个子树满足其内部节点编号在值域上连续
一些数在值域上连续的意思即其在值域上构成一个连续的区间

题解

按照树的size升序枚举树,配合简单剪枝,稍微判断就好。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<cstdio>
#include<algorithm>
const int MAXN=100000+5;
struct Edge{int next,target;};
struct Data{int id,val;};
int head[MAXN],cnt,fa[MAXN],min,max,n,vis[MAXN][3],scnt;Edge edge[MAXN];Data data[MAXN];
bool comp(Data a,Data b){return a.val<b.val;}
void AddEdge(int u,int v)
{
Edge e;
e.next=head[u];e.target=v;head[u]=++cnt;
edge[cnt]=e;
}
void Search(int now)
{
if(vis[now][0])
{
min=std::min(vis[now][0],min);
max=std::max(vis[now][1],max);
scnt+=vis[now][2];
return;
}
scnt++;
for(int i=head[now];i;i=edge[i].next)
{
Search(edge[i].target);
}
}
int main()
{
int x,y;
scanf("%d",&n);
for(int i=1;i<=n;i++)
data[i].id=i;
for(int i=1;i<n;i++)
{
scanf("%d %d",&x,&y);
AddEdge(x,y);
data[x].val++;
}
int ans=0,ii;
std::sort(data+1,data+n+1,comp);
for(int i=1;i<=n;i++)
{
ii=data[i].id;
min=max=ii;
scnt=0;
Search(ii);
vis[ii][0]=min;
vis[ii][1]=max;
vis[ii][2]=scnt;;
if(scnt==max-min+1) ans++;
}
printf("%d",ans);
return 0;
}

D

题目

珂朵莉想求123456789101112131415…的第n项

题解

打个大大的表直接输出就好

代码

1
2
3
4
5
6
7
8
9
#include<cstdio>
char c[1555]="#12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641";
int main()
{
int n;
scanf("%d",&n);
printf("%c",c[n]);
return 0;
}
最近的文章

Vijos 1881闪烁的繁星 题解

题目有n颗星星,每颗星星或亮或暗,刚开始都是亮着的,每次选择一颗星星改变它的状态,每次改变后求最大的相邻星星状态不同的长度。 题解处理这道题,我们使用线段树,在向上传递时,在父亲节点中把两个子节点的值合并处理。这样不断向上传递到达根节点合并完毕后即可获得结果。此处的合并处理,目的在于将两个子节点拼接 …

于  Vijos 继续阅读
更早的文章

Vijos1401 复制CS题解

题目初始时只有1台电脑上装有CS,你有$K$根串口线,只能通过串口线传输数据,一根串口线只能连接两台电脑,每台电脑只有1个串口接口,每次复制需要1小时,且在一定时间段内不得复制,之前的复制也将被中断,求复制完所需的最小时间。 题解题目很简单,对于每段时间(0~第一次视察,每次视察间的空隙,最后一次视 …

于  Vijos 继续阅读