1、题目 - 日历问题 .1题目 - 生日相同 .3题目 - 开关灯 .5题目 -出现次数超过一半的数 .6题目 - 谁考了第 k 名 .8题目 - 区间合并 .9题目 - 距离排序 .12题目 - 吃糖果问题 .14题目- 采药 .16题目- 辉辉的日程表 .17题目- 二进制加法 .20题目- 神奇的幻方 .22题目 - 试剂稀释 .25题目 - 日历问题来源 Shanghai 2004 Preliminary描述在我们现在使用的日历中, 闰年被定义为能被 4 整除的年份,但是能被 100 整除而不能被 400 整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100
2、 不是闰年,而 1600, 2000 和 2400 是闰年。 给定从公元 2000 年 1 月 1 日开始逝去得天数,你的任务是给出这一天是哪年哪月哪日星期几。 提示:2000 年 1 月 1 日是周六关于输入输入包含若干行,每行包含一个正整数,表示从 2000 年 1 月 1 日开始逝去的天数。输入最后一行是 1, 不必处理。可以假设结果的年份不会超过 9999。关于输出对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: “Sunday“, “Monday“, “Tuesday“, “
3、Wednesday“, “Thursday“, “Friday“ and “Saturday“。例子输入1730 1740 1750 1751 -1例子输出2004-09-26 Sunday 2004-10-06 Wednesday 2004-10-16 Saturday 2004-10-17 Sunday提交程序#include int type(int); char week710 = “Saturday“, “Sunday“, “Monday“, “Tuesday“, “Wednesday“, “Thursday“, “Friday“; int year2= 365, 366; int
4、month212 = 31, 28, 31, 30, 31, 30, 31, 31, 30,31, 30, 31,31, 29, 31, 30, 31, 30, 31, 31, 30,31, 30, 31; int main(int argc, char* argv) int days, dayofweek; int i = 0, j = 0; while( scanf(“%d“, for( i = 2000; days = yeartype(i); i+) days -= yeartype(i); for( j = 0; days = monthtype(i)j; j+) days -= m
5、onthtype(i)j; printf(“%d-%02d-%02d %sn“, i, j + 1, days + 1, weekdayofweek); return 0; int type( int m) if( m % 4 != 0 | ( m % 100 = 0 else return 1; 题目 - 生日相同来源 工学院计算概论07描述在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的学号,出生月日。试找出所有生日相同的学生。关于输入第一行为整数 n,表示有 n 个学生,n #include int main()int y100,r100,t100;char
6、xh10010,tmpxh10,sc10010;int n,i,k,j,tmpy,tmpr,tmpt,tx,h;scanf(“%d“,for(i=0;iti+1)tmpy=yi+1;yi+1=yi;yi=tmpy;tmpr=ri+1;ri+1=ri;ri=tmpr;tmpt=ti+1;ti+1=ti;ti=tmpt;strcpy(tmpxh,xhi+1);strcpy(xhi+1,xhi);strcpy(xhi,tmpxh);for(tx=1;tx1)printf(“%d %d“,yi-1,ri-1);for(h=1;hint a5001=0;int main()int n,m,i,j;sca
7、nf(“%d,%d“,for(i=1;i#include int main()int m,n,i,j,k,sz1001,js100=0,you=0;scanf(“%d“,for(i=0;ihalf)printf(“%dn“,k-49);you=1;if(you=0)printf(“non“);system(“pause“);return 0;题目 - 谁考了第 k 名来源 北大医学部07计算概论模拟考试1描述在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k 名学生的学号和成绩。关于输入第一行有两个整数,学生的人数 n(1n100) ,和求第 k 名学生的 k(1kn
8、) 。 其后有 n 行数据,每行包括一个学号(整数)和一个成绩(浮点数) ,中间用一个空格分隔。关于输出输出第 k 名学生的学号和成绩,中间用空格分隔。 (注:请用%g 输出成绩)例子输入5 390788001 67.890788002 90.390788003 6190788004 68.490788005 73.9例子输出90788004 68.4#include#define M 105int main()int haoM,i,j;double fenM;int n,k;scanf(“%d %d“,for(i=0;ifenj+1)tmp=fenj+1;fenj+1=fenj;fenj=t
9、mp;num=haoi+1;haoi+1=haoi;haoi=num;printf(“%d %g“,haon-k,fenn-k);return 0;题目 - 区间合并描述给定 n 个闭区间 ai; bi,其中 i=1,2,.,n。 这些区间可以用一组不间断的闭区间表示。我们的任务是找出这些区间是否可以用一个不间断的闭区间表示,如果可以的话将这个最小的闭区间输出,否则输出 no。关于输入第一行为一个整数 n,3 n 50000。表示输入区间的数量。在第 i+1行上(1 i n) ,为两个整数 ai 和 bi ,整数之间用一个空格分隔,表示区间 ai; bi(其中 1 ai bi 10000) 。
10、关于输出输出为一行,如果这些区间可以合并为一个闭区间,输出这个最小的闭区间,否则输出”no”例子输入55 61 510 106 98 10例子输出1 10提示用结构来存储区间信息并按照相应规则对区间排序#includeint main()int n;int a50000;int b50000;int k,i;int temp,temp2;int A=1;int max=0;scanf(“%d“,for(i=0;iai+1)temp=ai;ai=ai+1;ai+1=temp;temp2=bi;bi=bi+1;bi+1=temp2;for(i=0;imax)max=bi;if(!A)printf(
11、“no“);elseprintf(“%d %d“,a0,max);system(“pause“);return 0;题目 - 距离排序来源 POJ 3702描述给出三维空间中的 n 个点(不超过10个),求出 n 个点两两之间的距离,并按距离由大到小依次输出两个点的坐标及它们之间的距离。关于输入输入包括两行,第一行包含一个整数 n 表示点的个数,第二行包含每个点的坐标(坐标都是整数)。点的坐标的范围是0到100,输入数据中不存在坐标相同的点。关于输出对于大小为 n 的输入数据,输出 n*(n-1)/2行格式如下的距离信息: (x1,y1,z1)-(x2,y2,z2)=距离 其中距离保留到数点后
12、面2位。 例子输入40 0 0 1 0 0 1 1 0 1 1 1例子输出(0,0,0)-(1,1,1)=1.73(0,0,0)-(1,1,0)=1.41(1,0,0)-(1,1,1)=1.41(0,0,0)-(1,0,0)=1.00(1,0,0)-(1,1,0)=1.00(1,1,0)-(1,1,1)=1.00提示注意: 冒泡排序满足下面的性质,选择排序和快速排序(qsort 或 sort)需要对下面的情况进行额外处理 使用冒泡排序时要注意边界情况的处理,保证比较的两个数都在数组范围内 1. 对于一行输出中的两个点(x1,y1,z1)和(x2,y2,z2),点(x1,y1,z1)在输入数据中
13、应出现在点(x2,y2,z2)的前面。 比如输入: 2 0 0 0 1 1 1 输出是: (0,0,0)-(1,1,1)=1.73 但是如果输入: 2 1 1 1 0 0 0 输出应该是: (1,1,1)-(0,0,0)=1.73 2. 如果有两对点 p1,p2和 p3,p4的距离相同,则先输出在输入数据中靠前的点对。 比如输入: 3 0 0 0 0 0 1 0 0 2 输出是: (0,0,0)-(0,0,2)=2.00 (0,0,0)-(0,0,1)=1.00 (0,0,1)-(0,0,2)=1.00 如果输入变成: 3 0 0 2 0 0 1 0 0 0 则输出应该是: (0,0,2)-(
14、0,0,0)=2.00 (0,0,2)-(0,0,1)=1.00 (0,0,1)-(0,0,0)=1.00#include#includeint main()int n,i,j;scanf(“%d“,struct pointint x;int y;int z;site10;for(i=0;i=i;j-)if(pairj.dpairj-1.d)temp=pairj;pairj=pairj-1;pairj-1=temp;for(i=0;i N 0) 。妈妈告诉名名每天可以吃一块或者两块巧克力。假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。例如:如果 N=1,则名名第1天就吃掉它,
15、共有1种方案;如果 N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案;如果 N=3,则名名第1天可以吃 1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案;如果 N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。现在给定 N,请你写程序求出名名吃巧克力的方案数目。关于输入输入只有1行,即整数 N。关于输出输出只有1行,即名名吃巧克力的方案数。例子输入4例子输出5#include #include int fun(int n)if(n=1)return 1;if(n=2)return 2;else retur
16、n fun(n-1)+fun(n-2);int main()int n;scanf(“%d“,printf(“%dn“,fun(n);return 0;题目- 采药描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说: “孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。 ” 如果你是辰辰,你能完成这个任务吗?关于输入输入第一
17、行有两个整数 T(1 T 1000)和 M(1 M 100) ,用一个空格隔开,T 代表总共能够用来采药的时间,M 代表山洞里的草药的数目。接下来的 M 行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。关于输出输出包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。例子输入70 371 10069 11 2例子输出3#include int totalTime, medics;int value100;int time100;int max1001;int main() scanf(“%d%d“, int i, t
18、;for (i=0; i0; t-)if (timei maxt)/第 i 个的价值+不选第 i 个且用时为 t-timei-1时最大价值maxt = valuei + maxt-timei;printf(“%dn“, maxtotalTime);system(“pause“);return 0;题目- 辉辉的日程表描述自从辉辉同学的光荣事迹出现在 2012 年计算概论期末考试题中之后,辉辉就火了,报社、电视台纷纷请他接受采访,学弟学妹也都想找他交流学习经验。从那时起,辉辉的日程都会排得很满,因为他每天都会先后收到多份预约请求。于是,他希望借助日程表的帮助,来确定可以接受其中哪些预约。已知辉辉
19、每天愿意接受预约的时间为 9 点到 21 点。排日程表时遵循先到先得的原则,且只有预约时间段完全可用时才能接受预约,接受之后这些时间就不能再次被预约了。请你帮助辉辉设计一个日程表管理程序。关于输入第 1 行为 1 个整数 n,表示收到 n 份预约, n 10。之后有 n 行预约请求,每行包含 2 个整数 t1 和 t2 ,分别表示每份预约的开始时刻和结束时刻(精确到小时,例如 10 表示 10 点) ,9 t1 #include #define M 14int main()int n,szM2,is24=0,i,j,k,flag;scanf(“%d“,for(i=0;i#include int
20、 main()int n,i,j,k;int a,b,c,len;scanf(“%d“,for(i=0;i0)fi2len+=c%2+0;c/=2;for(k=len-1;k=0;k-)printf(“%c“,fi2k);system(“pause“);return 0;题目- 神奇的幻方来源 医学部计算概论2011年期末考试(李龙)描述在数学上,有一种 n*n 的矩阵,名字叫做幻方。它的含义是,这个矩阵的所有的行的和、所有的列的和以及两条对角线上的和,都是同一个数字。而且在这个矩阵中,从到 n*n 各出现了一次并且只出现了一次。比如,中国历史上易经所用的著名的“洛书” ,其本质就是一个三阶幻方:8 1 6