}
输出:
_________
2.#includeusingnamespacestd;
intmain(){
chara[100][100],b[100][100];stringc[100];
stringtmp;
intn,i=0,j=0,k=0,total_len[100],length[100][3];
CCFNOIP2016初赛提高组C++语言试题
第5页,共13页
cin>>n;
getline(cin,tmp);
for(i=0;igetline(cin,c[i]);
total_len[i]=c[i].size();
}
for(i=0;ij=0;
while(c[i][j]!
=':
'){
a[i][k]=c[i][j];
k=k+1;
j++;
}
length[i][1]=k-1;
a[i][k]=0;
k=0;
for(j=j+1;jb[i][k]=c[i][j];
k=k+1;
}
length[i][2]=k-1;
b[i][k]=0;
k=0;
}
for(i=0;iif(length[i][1]>=length[i][2])
cout<<"NO,";
else{
k=0;
for(j=0;jif(a[i][k]==b[i][j])
k=k+1;
if(k>length[i][1])break;
}
if(j==length[i][2])
cout<<"NO,";
else
cout<<"YES,";
}
}
cout<return0;
CCFNOIP2016初赛提高组C++语言试题
第6页,共13页
}
输入:
3AB:
ACDEbFBkBDAR:
ACDBrT
SARS:
SevereAtypicalRespiratorySyndrome输出:
_________
(注:
输入各行前后均无空格)
3.#include
usingnamespacestd;
intlps(stringseq,inti,intj){
intlen1,len2;
if(i==j)return1;
if(i>j)return0;
if(seq[i]==seq[j])
returnlps(seq,i+1,j-1)+2;
len1=lps(seq,i,j-1);
len2=lps(seq,i+1,j);
if(len1>len2)
returnlen1;
returnlen2;
}
intmain(){
stringseq="acmerandacm";
intn=seq.size();
cout<return0;
}
输出:
_________
4.#include
#include
usingnamespacestd;
intmap[100][100];
intsum[100],weight[100];
intvisit[100];
CCFNOIP2016初赛提高组C++语言试题
第7页,共13页
intn;
voiddfs(intnode){
visit[node]=1;
sum[node]=1;
intv,maxw=0;
for(v=1;v<=n;v++){
if(!
map[node][v]||visit[v])
continue;
dfs(v);
sum[node]+=sum[v];
if(sum[v]>maxw)
maxw=sum[v];
}
if(n-sum[node]>maxw)
maxw=n-sum[node];
weight[node]=maxw;
}
intmain(){
memset(map,0,sizeof(map));
memset(sum,0,sizeof(sum));
memset(weight,0,sizeof(weight));
memset(visit,0,sizeof(visit));
cin>>n;
inti,x,y;
for(i=1;icin>>x>>y;
map[x][y]=1;
map[y][x]=1;
}
dfs
(1);
intans=n,ansN=0;
for(i=1;i<=n;i++)
if(weight[i]ans=weight[i];
ansN=i;
}
cout<return0;
}
输入:
11
CCFNOIP2016初赛提高组C++语言试题
第8页,共13页
12
13
24
25
26
37
78
711
69
910
输出:
_________
五、完善程序(共2题,每题14分,共计28分)
1.(交朋友)根据社会学研究表明,人们都喜欢找和自己身高相近的人做朋友。
现在有n名身高两两不相同的同学依次走入教室,调查人员想预测每个人在走入教室的瞬间最想和已经进入教室的哪个人做朋友。
当有两名同学和这名同学的身高差一样时,这名同学会更想和高的那个人做朋友。
比如一名身高为1.80米的同学进入教室时,有一名身高为1.79米的同学和一名身高为1.81米的同学在教室里,那么这名身高为1.80米的同学会更想和身高为1.81米的同学做朋友。
对于第一个走入教室的同学我们不做预测。
由于我们知道所有人的身高和走进教室的次序,所以我们可以采用离线的做法来解决这样的问题,我们用排序加链表的方式帮助每一个人找到在他之前进入教室的并且和他身高最相近的人。
(第一空2分,其余3分)
#includeusingnamespacestd;#defineMAXN200000
#defineinfinity2147483647
intanswer[MAXN],height[MAXN],previous[MAXN],next[MAXN];intrank[MAXN];
intn;
voidsort(intl,intr){
intx=height[rank[(l+r)/2]],i=l,j=r,temp;while(i<=j)
{
while(height[rank[i]]x)j--;
if(
(1)){
temp=rank[i];rank[i]=rank[j];rank[j]=temp;
CCFNOIP2016初赛提高组C++语言试题
第9页,共13页
i++;j--;
}
}
if(iif(l}
intmain()
{
cin>>n;
inti,higher,shorter;
for(i=1;i<=n;i++){
cin>>height[i];
rank[i]=i;
sort(1,n);
for(i=1;i<=n;i++){
previous[rank[i]]=rank[i-1];
(2);
}
for(i=n;i>=2;i--){
higher=shorter=infinity;
if(previous[i]!
=0)
shorter=height[i]-height[previous[i]];if(next[i]!
=0)
(3);
if((4))
answer[i]=previous[i];
else
answer[i]=next[i];
next[previous[i]]=next[i];
(5);
}
for(i=2;i<=n;i++)
cout<
"<return0;
}
2.(交通中断)有一个小国家,国家内有n座城市和m条双向的道路,每条道路连接着两座不同的城市。
其中1号城市为国家的首都。
由于地震频繁可能导致某一个城市与外界交通全部中断。
这个国家的首脑想知道,如果只有第i(i>1)个城市因地震而导致交通中断时,首都到多少个城市的最短路径长度会发生改变。
如果因为无法通过第i个城市而导致从首都出发无法到达某个城
CCFNOIP2016初赛提高组C++语言试题
第10页,共13页
市,也认为到达该城市的最短路径长度改变。
对于每一个城市i,假定只有第i个城市与外界交通中断,输出有多少个城市会因此导致到首都的最短路径长度改变。
我们采用邻接表的方式存储图的信息,其中head[x]表示顶点x的第一条边的编号,next[i]表示第i条边的下一条边的编号,point[i]表示第i条边的终点,weight[i]表示第i条边的长度。
(第一空2分,其余3分)
#include#includeusingnamespacestd;#defineMAXN6000#defineMAXM100000
#defineinfinity2147483647
inthead[MAXN],next[MAXM],point[MAXM],weight[MAXM];intqueue[MAXN],dist[MAXN],visit[MAXN];
intn,m,x,y,z,total=0,answer;
voidlink(intx,inty,intz){
total++;
next[total]=head[x];head[x]=total;point[total]=y;weight[total]=z;total++;
next[total]=head[y];head[y]=total;point[total]=x;weight[total]=z;
}
intmain(){
inti,j,s,t;cin>>n>>m;
for(i=1;i<=m;i++){
cin>>x>>y>>z;link(x,y,z);
}
for(i=1;i<=n;i++)dist[i]=infinity;
(1);
queue[1]=1;
visit[1]=1;
s=1;
CCFNOIP2016初赛提高组C++语言试题第11页,共13页
t=1;
//使用SPFA求出第一个点到其余各点的最短路长度
while(s<=t){
x=queue[s%MAXN];
j=head[x];
while(j!
=0){
if(
(2)){
dist[point[j]]=dist[x]+weight[j];
if(visit[point[j]]==0){
t++;
queue[t%MAXN]=point[j];
visit[point[j]]=1;
}
}
j=next[j];
}
(3);
s++;
}
for(i=2;i<=n;i++){
queue[1]=1;
memset(visit,0,sizeof(visit));
visit[1]=1;
s=1;
t=1;
while(s<=t){//判断最短路长度是否不变
x=queue[s];
j=head[x];
while(j!
=0){
if(point[j]!
=i&&(4)
&&visit[point[j]]==0){
(5);
t++;
queue[t]=point[j];
}
j=next[j];
}
s++;
}
answer=0;
for(j=1;j<=n;j++)answer+=1-visit[j];
cout<
"<
CCFNOIP2016初赛提高组C++语言试题
第12页,共13页
}
return0;
}
CCFNOIP2016初赛提高组C++语言试题第13页,共13页