吴凡的题库——快快编程1001-1100

  1. 排队打饭
题目描述 下课了,n个同学排队吃饭,队伍中每人用一个整数表示其学号。餐厅只能同时容纳m个同学就餐。就餐记录是这样的,进入餐厅就餐的同学,记录其学 号,离开餐厅后,记录其学号的负值。例如,5,表示5号同学进入食堂就餐,-5表示他离开餐厅。离开餐厅的顺序是按照就餐先后顺序的,如果1号在5 号之前进入餐厅,也一定会在5号之前离开餐厅。求记录结束时餐厅还有多少人?如果餐厅已经坐满人,还有 同学尝试进入,这种情况是不允许的,一 定是记录出现了错误,此时程序输出Error。 
输入输出格式 输入格式 第一行两个正整数,n和m,n表示排队人数,m表示食堂最大容量,n <=10000,m<=500 第二行一个正整数k,表示记录的数量,k<=20000 第三行k个整数,表示学生就餐和离开信息,p表示p同学进入食堂,-p表示p同学离开食堂  输出格式 一个整数,表示食堂中还有多少人在就餐 
输入输出样例 输入样例#1: 5 4 8 1 2 3 5 -1 8 -2 -3  输出样例#1: 2 说明: 学号为1,2,3,5的学生进入食堂就餐,1号离开,8号进入食堂,2号离开,3号离开。此时食堂中还有2人就餐,5号和8号。  输入样例#2: 5 3 7 1 2 3 4 5 -1 -2  输出样例#2: Error 说明: 1,2,3号进入食堂就餐,食堂最大容量为3,当4号进入食堂就餐,超出食堂最大人数限制,输出Error。  输入样例#3:  输出样例#3:  
#include<iostream> using namespace std; int n,m,k,cnt=0,x; int main(){ 	cin>>n>>m; 	cin>>k; 	for(int i=0;i<k;i++){ 		cin>>x; 		if(x>0)cnt++; 		else cnt--; 		if(cnt>m)break; 	} 	if(cnt>m)cout<<Error; 	else cout<<cnt<<endl; 	return 0; } 
  1. 队伍长度(输出时注意:行末不能出现空格)
题目描述 假期出行,高速公路十分拥堵。一条高速路口收费站只开放了两个收费窗口,众多车辆在这两个窗口前的通道排起了长龙。车主都喜欢更短的队伍,因 此每当有新到达车辆,他会选择队列长度短的窗口排队,如果两个队列一样长,选择第一个窗口。现在有一段时间内该收费站的车辆通行记录,车辆按 照到达次序依次编号1,2,3…记录只包含三个单词,arrive和leave1,leave2,arrive表示有车辆到达,leave1表示车辆通过窗口1后离开,leave2表示 车辆通过窗口2后离开。请问记录结束时,两支队伍各有哪些车辆。 
输入输出格式 输入格式 第一行,一个正整数n,表示有多少条记录,n<=10000。 第二行,n个字符串,只有arrive,leave1,leave2三种记录,表示车辆到达和离开收费站的情况,保证不会出现队列为空后仍然有车辆leave的情况。  输出格式 两行,第一行表示记录结束时窗口1前的排队车辆序号,第二行表示记录结束时窗口2前的排队车辆序号,序号间由空格隔开。如果队列为空,输出一个 数字0。 注意:行末不能出现空格。 
输入输出样例 输入样例#1: 7 arrive arrive arrive arrive leave1 leave1 arrive  输出样例#1: 5 2 4 说明: 前4个arrive,分别是第1辆车排窗口1,第2辆车排窗口2,第3辆排窗口1,第4辆排窗口2。接下来窗口1有2辆车离开,1,3号车离开后队 列为空。第5个arrive,5号车排在窗口1队列。记录结束窗口1前队列中有1辆车,5号,窗口2前队列有两辆车,2号和4号。  输入样例#2: 5 arrive arrive leave1 leave2 arrive  输出样例#2: 3 0 说明: 前4条记录过后,两个窗前都没有排队车辆,最后一个arrive,3号车排在窗口1前。窗口1队列中有1辆车,3号,窗口2队列为空,输出0。 输入样例#3:  输出样例#3:  
#include<iostream> #include<string> using namespace std; const int N=10000; int n,b1,f1,b2,f2,q1[N],q2[N],id; int main(){ 	cin>>n; 	string s; 	for(int i=0;i<n;i++){ 		cin>>s; 		if(s==arrive){ 			if(b1-f1<=b2-f2) 			    q1[b1++]=id++; 			else 			    q2[b2++]=id++; 		} 		else if(s==leave1) 			f1++; 		else 		    f2++; 	} 	if(f1==b1) 	    cout<<0<<endl; 	else{ 		for(int i=f1;i<=b1-2;i++) 		    cout<<q1[i]+1<< ; 		cout<<q1[b1-1]+1<<endl; 	} 	if(b2==f2) 	    cout<<0<<endl; 	else{ 		for(int i=f2;i<=b2-2;i++) 		    cout<<q2[i]+1<< ; 		cout<<q2[b2-1]+1<<endl; 	} 	return 0; } 
  1. Candy Sharing 分糖果
题目描述 There are 41 candies to be distributed to 7 children. Each child must receive the same amount of candies. Please write a program to calculate the distribution results. Output the number of candy each child gets. The second line shows how many candies are left.   现在有41个糖果,要分给7个小朋友,每个小朋友拿到的糖果数量一定要相同。 请写一个程序,计算出分配结果。 输出第一行为每个小朋友拿到的糖果数量。 输出第二行为剩下几个糖果。 
输入输出格式 输入格式 无 输出格式 输出第一行为每个小朋友拿到的糖果数量。 输出第二行为剩下几个糖果。 
输入输出样例 输入样例#1: 无 输出样例#1: 无 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 
#include<iostream> #include<iomanip> using namespace std; int main(){ 	cout<<41/7<<endl; 	cout<<41%7<<endl; 	return 0; } 
  1. 平均分
题目描述 编程班上有6位同学,他们的作业分数分别为: 100分 59分 1分 100分 99分 2分 请写一个程序,求出他们的平均分,结果保留1位小数。 
输入输出格式 输入格式 无 输出格式 输出一个小数,保留1位小数 
输入输出样例 输入样例#1: 无 输出样例#1: 无 输入样例#2:  输出样例#2:  输入样例#3:  输出样例#3:  
#include<iostream> #include<iomanip> using namespace std; int main(){ 	cout<<fixed<<setprecision(1)<<(100 + 59 + 1 + 100 + 99 + 2) /6.0<<endl; 	return 0; } 
  1. 取款
题目描述 你是一个银行小职员,你的日常工作就是根据客户要求,从银行里为他们提取特定数额的纸币。已知客户需要提取n元,你需要用最少的 纸币数量凑出n纸币数量凑出n元,请问最少要几张?  注意你所在国家只有以下面值的纸币:1元,2元,3元,9元。  输入输出格式 输入格式 输入文件withdraw.in 输入一个正整数n,n<=10000 输出格式 输出文件withdraw.out 输出一个正整数 
输入输出样例 输入样例#1: 8 输出样例#1: 3 输入样例#2: 30 输出样例#2: 4 输入样例#3: 无 输出样例#3: 无 
#include<bits/stdc++.h> using namespace std; const int N=4; int money[N]={9,3,2,1}; int main(){ 	freopen(withdraw.in, r, stdin); 	freopen(withdraw.out, w, stdout); 	int n,ans=0; 	cin>>n; 	for(int i=0;i<N;i++){ 		ans+=n/money[i]; 		n%=money[i]; 	} 	cout<<ans<<endl; 	return 0; } 
  1. 防御塔
题目描述 敌人有n架轰炸机依次向你飞来,第i架飞机高度为h[i]。你需要用防御塔发出防空导弹炸毁敌机。  你的防御塔有一个优点:第一枚导弹可以打中任意高度。  但是,你的防御塔也有一个缺陷:之后每次导弹的高度要比上一枚导弹低。  为了击中所有敌机,请问最少要安排几个防御塔?    输入输出格式 输入格式 输入文件towerdefense.in 第一行为正整数n,n<=1000 第二行为n个正整数,代表飞机高度,均不超过10000 输出格式 输出文件towerdefense.out 输出一个正整数。 
输入输出样例 输入样例#1: 5 1 2 3 4 3 输出样例#1: 4 输入样例#2: 4 1 2 1 2 输出样例#2: 3 输入样例#3: 无 输出样例#3: 无 
#include<bits/stdc++.h> using namespace std; int main(){ 	freopen(towerdefense.in, r, stdin); 	freopen(towerdefense.out, w, stdout); 	int cnt=0, d[1000], h[1000], n; 	cin>>n; 	for(int i=0;i<n;i++)cin>>h[i]; 	for(int i=0,j;i<n;i++){ 		for(j=0;j<cnt;j++) 		    if(h[i]<d[j])break; 		d[j]=h[i]; 		if(j==cnt)cnt++; 			 	}  	cout<<cnt<<endl; 	return 0; } 
  1. 混合饮料
题目描述 你有两杯果汁:一杯苹果汁有a毫升,一杯西柚汁有b毫升。现在你希望把两杯饮料混合成自创的“苹果西柚汁”,然后再对半分成两杯一样多的饮料。请 问最后每一杯有几毫升? 
输入输出格式 输入格式 输入包含两个数字,用空格分开,输入的数字都不会超过10000。 输出格式 输出一个浮点数(保留1位小数)。 
输入输出样例 输入样例#1: 5 10 输出样例#1: 7.5 输入样例#2: 10 12 输出样例#2: 11.0 输入样例#3:  输出样例#3:  
#include<iostream> #include<iomanip> using namespace std; int a,b; int main(){	 	cin>>a>>b; 	double c = a / 2.0 + b / 2.0; 	cout<<fixed<<setprecision(1)<<c; 	return 0; } 
  1. 预言家
题目描述 小明报出两个数字a,b,让你猜下一个数字是几。 哦对了,小明告诉你他说的数字一定是等差数列,希望这个条件能帮到你。 
输入输出格式 输入格式 输入包含两个正整数,用空格隔开,都不超过100。 输出格式 输出一个整数。 
输入输出样例 输入样例#1: 1 3 输出样例#1: 5 输入样例#2: 10 20 输出样例#2: 30 输入样例#3:  输出样例#3:  
#include<iostream> using namespace std; int a,b,c; int main(){	 	cin>>a>>b; 	c = b + b - a;  	cout<<c;              	return 0; } 
  1. 单链表(选择题) //注意:以快快网站题目为准,发布word旧版可能有错
题目描述 1. 线性表的顺序存储结构是一种(   ) A.        随机存取的存储结构 B.        顺序存取的存储结构 C.        索引存取的存储结构 D.       散列存取的存储结构 2. 一个顺序表所占用的存储空间大小与(    )无关。 A.        表的长度 B.        元素的类型 C.        元素的存放顺序 D.       元素中各字段的类型 3. 要将一个顺序表{a0,a1,,…,an-1}中i号数据元素ai(0≤i≤n-1)删除,需要移动(   )个数据元素。 A.        i B.        n-i-1 C.        n-i D.       n-i+1 4.线性表采用链式存储时,其地址(  )。 A.        必须是连续的 B.        一定是不连续的 C.        部分地址必须是连续的 D.       连续与否均可以 5. 链式存储结构的最大优点是(   )。 A.        便于随机存取 B.        存储密度高 C.        便于进行插入和删除操作 D.       无需预分配空间 6. 有以下结构体说明和变量定义,如图所示,指针 p、q、r 分别指向一个链表中的三个连续结点。 struct node { int data; node *next; } *p, *q, *r; 现要将 q 和 r 所指结点的先后位置交换,同时要保持链表的连续,以下程序段中错误 的是(    )。 A.        q->next = r->next; p->next = r; r->next = q; B.        p->next = r; q->next = r->next; r->next = q; C.        q->next = r->next; r->next = q; p->next = r; D.       r->next = q; q->next = r->next; p->next = r; 7. 在带尾指针(链表指针clist指向尾结点)的非空循环单链表中每个结点都以next字段的指针指向下一个节点。假定其中已经有2个以 上的结点。下 面哪些说法是正确的(    ) A.        如果p指向一个待插入的新结点,在头部插入一个元素的语句序列为: p->next = clist->next; clist->next = p; B.        如果p指向一个待插入的新结点,在尾部插入一个元素的语句序列为: p->next = clist;clist->next = p; C.        在头部删除一个结点的语句序列为: clist->next = clist->next->next; p = clist->next; delete p; D.       在尾部删除一个结点的语句序列为。 p = clist; clist = clist ->next; delete p; 8. 在链表中若经常要删除表中最后一个结点或在最后一个结点之后插入一个新结点,则宜采用(  )存储方式。 A.        顺序表 B.        用头指针标识的循环单链表 C.        用尾指针标识的循环单链表 D.       用头指针标识的非循环单链表   9. 非空的循环单链表head的尾结点(由p所指向)满足(  )。 A.        p->next == NULL B.        p == NULL C.        p->next == head D.       p == head 10. 某线性表最常用的操作是在最后一个结点之后插入一个结点或删除第一个结点,故采用(  )存储方式最节省运算时间。 A.        单链表 B.        仅有头结点的单循环链表 C.        双链表 D.       仅有尾指针的单循环链表 11. 在一个长度为n(n>1)的单链表上,设有头和尾两个指针,执行(  )操作与链表的长度有关。 A.        删除单链表中的第一个元素 B.        删除单链表中的最后一个元素 C.        在单链表第一个元素前插入一个新元素 D.       在单链表最后一个元素后插入一个新元素 12. 在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:(  )。 A.        p->next=s; s->next=p->next; B.        s->next=p->next; p->next=s; C.        p->next=s; p->next=s->next; D.       p->next=s->next; p->next=s; 13. 对于单链表表示法,以下说法错误的是 (    ) A.        数据域用于存储线性表的一个数据元素 B.        指针域或链域用于存放一个指向本结点所含数据元素的直接后继所在结点的指针 C.        所有数据通过指针的链接而组织成单链表 D.       NULL称为空指针,它不指向任何结点,只起标志作用 14. 在循环链表中,将头指针改设为尾指针(rear)后,其头结点和尾结点的存储位置分别是(  ) A.        rear和rear->next->next B.        rear->next和rear C.        rear->next->next和rear D.       rear和rear->next 15. 循环链表主要优点是(  ) A.        不再需要头指针了 B.        已知某个结点的位置后,能够容易找到它的直接前趋 C.        在进行插入、删除运算时,能更好地保证链表不断开 D.       从表中任一结点出发都能扫描到整个链表 16. 已知单链表中的元素以值递增有序排列,下列算法删除单链表中所有值相同的元素,同时释放被删结点空间。请将该算法补充完整。struct node{ int data; node *next; }LNode; void delete_equal(LNode *h){ LNode *p=h, *q; if (h==NULL)  return; while (p->next!=NULL) { q=p->next; if(p->data!=q->data) p=q; else  //相邻两元素值相等,则循环删除后继等值结点 while (q!=NULL && q->data==p->data) { __________________________ } } } A.        p->next=q->next; delete q; B.        q->next=p->next; delete q; q=p->next; C.        p->next=q->next; delete q; q= p->next; D.       p->next=q->next; delete q; q=p; 
输入输出格式 输入格式 无 输出格式 无 
输入输出样例 输入样例#1: 无 输出样例#1: 无 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无 
#include<iostream> #include<string> using namespace std; string ans[16]={A,C,B, D, D, D, A, C, C, D, B, B, C, B, D, C}; int i; int main() { 	cin>>i; 	cout<<ans[i-1]<<endl; 	return 0; } 
  1. 及格线
题目描述 语文老师的数学不太好,学生是否考试及格的问题,他总是算不对。你作为编程高手,决定出手相救。如果学生得分达到60分,那么就是及格的,应该 输出Pass;否则输出Fail。 
输入输出格式 输入格式 输入一个非负整数,保证不超过100 输出格式 输出Pass或者Fail 
输入输出样例 输入样例#1: 60 输出样例#1: Pass 输入样例#2: 59 输出样例#2: Fail 输入样例#3:  输出样例#3:  
#include<iostream> using namespace std; int main(){ 	int n; 	cin>>n;	 	if (n>=60)	 	    cout<<Pass<<endl;	  	else		//否则  	    cout<<Fail<<endl; 	return 0; }  
  1. 判断三的倍数
题目描述 输入正整数n,请判断n是不是3的倍数。输出Yes或者No。 n<=1000 
输入输出格式 输入格式 如题 输出格式 如题 
输入输出样例 输入样例#1: 6 输出样例#1: Yes 输入样例#2: 7 输出样例#2: No 输入样例#3:  输出样例#3:  
#include<iostream> using namespace std; int main(){ 	int n,x; 	cin>>n; 	if (n<=1000){ 		x=n%3;  		if (0==x) 		    cout<<Yes<<endl; 		else 		    cout<<No<<endl; 	} 	return 0; }  
  1. 优惠促销
题目描述 西佳佳商场进行暑期打折促销,一支钢笔单价10元。如果购买数量满100支可以打七折;否则不打折。请写一个程序,输入是一个正整数 表示购买数量 ,输出总费用。 
输入输出格式 输入格式 输入一个非负整数,保证不超过100000 输出格式 输出一个整数 
输入输出样例 输入样例#1: 80 输出样例#1: 800 输入样例#2: 200 输出样例#2: 1400 解释说明: 买200支笔可以打七折,每支笔单价变成7元,总费用=7元/支*200支=1400元 输入样例#3:  输出样例#3:  
#include<iostream> using namespace std; int main(){ 	int a; 	cin>>a;	 	if (a>100)  	    cout<<a * 7;	 	else 	    cout<<a * 10; 	return 0;  }  
  1. 数数
题目描述 输入一个正整数n,从小到大输出1到n共n个数。 
输入输出格式 输入格式 输入只有一行,包含一个正整数n,1<=n<=10000 输出格式 输出只有一行,包含若干个正整数,由空格隔开。 
输入输出样例 输入样例#1: 4 输出样例#1: 1 2 3 4 输入样例#2: 7 输出样例#2: 1 2 3 4 5 6 7 输入样例#3:  输出样例#3:  
#include<iostream> using namespace std; int main(){ 	int n,i; 	cin>>n; 	for(i=1;i<=n;i++){ 		cout<<i<< ; 	} 	return 0; } 
  1. 二的倍数
题目描述 输入一个正整数n,从小到大输出1到n里所有2的倍数。 
输入输出格式 输入格式 输入只有一行,包含一个正整数n,2<=n<=10000 输出格式 输出只有一行,包含若干个正整数,由空格隔开。 
输入输出样例 输入样例#1: 4 输出样例#1: 2 4 输入样例#2: 11 输出样例#2: 2 4 6 8 10 输入样例#3:  输出样例#3:  
#include<iostream> using namespace std; int n,i; int main(){ 	i = 2; 	cin>>n; 	while(i<=n){ 		cout<<i; 		cout<< ; 		i+=2; 	} 	return 0; } 
  1. 三的次方
题目描述 输入正整数b,输出3的b次方。 
输入输出格式 输入格式 输入一个整数b,数据的范围: 1<=b<=30 输出格式 一个整数 
输入输出样例 输入样例#1: 2 输出样例#1: 9 输入样例#2: 4 输出样例#2: 81 输入样例#3: 30 输出样例#3: 205891132094649 
#include<iostream> using namespace std; int main(){ 	long long b; 	cin>>b;	 	long long ans=1,i=1; 	while(i<=b){ 		ans*=3; 		i++; 	} 	cout<<ans<<endl; 	return 0; }    
  1. 图论选择题
题目描述 1. 已知n个顶点的有向图,若该图是强连通的(从所有顶点都存在路径到达其他顶点),则该图中最少有(        )条有向边?  A. n      B. n+1     C. n-1     D. n*(n-1) 2. 无向完全图是图中每对顶点之间都恰有一条边的简单图。已知无向完全图G有7个顶点,则它共有(   )条边。 A. 7    B. 21    C. 42    D. 49 3. 在无向图中,所有顶点的度数之和是边数的(       )倍。 A. 0.5    B. 1    C. 2    D. 4 4. 有向图中每个顶点的度等于该顶点的(    ) A. 入度     B. 出度     C. 入度与出度之和     D. 入度与出度之差 5. 6个顶点的连通图的最小生成树,其边数为(    )。 A. 6    B. 5    C. 7    D. 4 6. 设G是有6个结点的完全图,要得到一棵生成树,需要从G中删去(    )条边。 A. 6    B. 9    C. 10    D. 15 7. G 是一个非连通简单无向图,共有 28 条边,则该图至少有(      )个顶点。 A.  10      B.  9      C.  8      D.  7 8. 设简单无向图 G 有 16 条边且每个顶点的度数都是 2,则图 G 有(    )个顶点。 A. 10    B. 12    C. 8    D. 16 9. 设 G 是有 n 个结点、m 条边(n ≤       m)的连通图,必须删去 G 的(    )条边,才能使得 G 变成一棵树。 A.  m – n + 1    B.  m – n    C. m + n + 1    D.  n – m + 1 10. 在一个无向图中,如果任意两点之间都存在路径相连,则称其为连通图。右图是一个有5个顶点、8条边的连通图。若要使它不再是连通图,至少要 删去其中的(    )条边。 A.2    B.3    C.4    D.5 11. 对一个有向图而言,如果每个节点都存在到达其他任何节点的路径,那么就称它是强连通的。例如,右图就是一个强连通图。事实上,在删掉边(       )后,它依然是强连通的。 A. a    B. b    C. c    D. d 12. 在一个无向图中,如果任意两点之间都存在路径相连,则称其为连通图。下图是一个有4 个顶点、6 条边的连通图。若要使它不再是连通图,至少 要删去其中的(    )条边。 A. 1    B. 2    C. 3    D. 4 13. 以 A0 作为起点,对下面的无向图进行深度优先遍历时,遍历顺序不可能是(     )。 A. A0, A1, A2, A3       B. A0, A1, A3, A2 C. A0, A2, A1, A3       D. A0, A3, A1, A2 14. (多选)从顶点A0出发,对有向图(  )进行广度优先搜索(BFS)时,一种可能的遍历顺序是 A0,A1,A2,A3,A4。 15.(多选)以A0作为起点,对下面的无向图进行深度优先遍历时(遍历的顺序与顶点字母的下标无关),最后一个遍历到的顶点可能是 (   )。 A.A1    B.A2    C.A3    D.A4 
输入输出格式 输入格式 无 输出格式 无 
输入输出样例 输入样例#1: 无 输出样例#1: 无 输入样例#2:  输出样例#2:  输入样例#3:  输出样例#3:  
#include<iostream> #include<string> using namespace std; string ans[20]={A,B,C,C,B,C,B,D,A,B,A,C,A,AD,CD}; // (*) int i; int main() { 	cin>>i; 	cout<<ans[i-1]<<endl; 	return 0; }