XDOJ2019试题第二组

函数值计算

试题名称	1-2 函数值计算
问题描述	
输入一个x值,计算以下三个函数的y值。当10>x≥0时,求出三个函数值的最大值;当x≥10时,输出三个函数值的和;当x<0时,求出三个函数导数值的最小值。
y1 = 2x+9			导数:
y2=7(1+x)^2	+9x  导数:
y3 = 7x^3/22-8			导数:

输入说明
输入一个实数x(-100≤x≤100)。

输入说明
当10>x≥0时,求出三个函数值的最大值;当x≥10时,输出三个函数值的和;当x<0时,求出三个函数导数值的最小值,小数点后保留2位小数。

测试样例:
	输入样例1
10
输出样例1
1276.18
输入样例2
0
	输出样例2
9.00
输入样例3
-2
	输出样例3
-5.00

#include <stdio.h>
int main(){
	float n,sum = 0;
	float a[3],b[3];
	int i;
	scanf("%f",&n);
		a[0] = 2*n+9;
		a[1]=7*(1+n)*(1+n)+9*n;
		a[2] = ((7*n*n*n)/22)-8;
	if(n>=0&&n<=10){
	     float  max = a[0];
	     for(i=1;i<3;i++){
	     	if(max<a[i]) max = a[i];
		 }
		 printf("%.2f",max);
	}else if(n>10){
		for(i=0;i<3;i++){
			sum = sum+a[i];
		}
		printf("%.2f",sum);
	}else {
		b[0] = 2;
		b[1]= 14*(1+n)+9;
		b[2]=21*n*n/22;
		float min = a[0];
	     for(i=1;i<3;i++){
	     	if(min>b[i]) min = b[i];
		 }
		 printf("%.2f",min);
	}
	return 0;
}

平方排序

试题名称	3-2 平方排序
问题描述	
对于n个整数,将它们按照其平方数数值从大到小的顺序输出,如果两数字的平方数相等,则原本数字值更大的先输出。
如给定n=4个整数-3043,则其平方数分别为90169,又因为3>-3,所以最终输出为43-30。

输入说明
输入分两行:
第一行为一个正整数n,0<n<100;
第二行为n个整数,每个整数绝对值都小于215,整数之间以空格分隔.

输出说明
输出n行,为按照要求排序后的n个整数,每输出一个数字就换行。

测试样例:
	输入样例1
4
-3043
输出样例1
4
3
-3
0

输入样例2
6
-512-8-45
	输出样例2
-8
5
-5
-4
2
1
#include <stdio.h>
int main(){
	int n,j;
	scanf("%d",&n);
	int a[100],i = 0;
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(i=0;i<n-1;i++){
		for(j=i;j<n;j++){
			if(a[i]*a[i]<a[j]*a[j]){
				int t;
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}else if(a[i]*a[i]==a[j]*a[j]){
				if(a[i]<a[j]){
						int t;
				t = a[i];
				a[i] = a[j];
				a[j] = t;
				}
			}
		}
	}
	for(i=0;i<n;i++){
		printf("%d\n",a[i]);
	}
	return 0;;
}

奇偶求和

试题名称	2-2奇偶求和
问题描述	
有一个整数数列a,已知当0<n≤10000时,具有如下通项表达式:
an = 3(n-1)^2+2(n-1)+1
输入一个正整数m,试编程计算该数列中大于100的前m个偶数之和sum_even、前m-1个奇数之和sum_odd。

输入说明
输入一个正整数m(0<m≤20)。

输出说明
输出数列a中大于100的前m个偶数之和sum_even以及数列中大于100的前m-1个奇数之和sum_odd,两个整数之间用空格分隔。

测试样例:
	输入样例1
1
输出样例1
162 0
输入样例2
5
	输出样例2
2050 1108
输入样例3
13
	输出样例3
16770 12540

#include <stdio.h>
int main(){
	int n,i = 0,m;
	int a[150];
	scanf("%d",&n);
	for(i=0;i<150;i++){
	   a[i]= 3*(i-1)*(i-1)+2*(i-1)+1; 
	}
	int sum_even = 0,sum_odd=0;
	for(i=7,m=1;m<=n;i++){
		if(a[i]%2==0) {
	 m++;
		sum_even = sum_even+a[i];
	} }
		for(i=7,m=1;m<n;i++){
		if(a[i]%2==1) {
	          m++;
		sum_odd = sum_odd+a[i];
	} }
	printf("%d %d",sum_even,sum_odd);
	return 0;
}

求矩阵的值

4-2求矩阵的值
问题描述	
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求求出全部局部极大值及其所在的位置。

输入说明
第一行中给出矩阵A的行数M和列数N(3≤M,N≤50);随后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出说明
按照“元素值 行号 列号”的格式输出。按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。各元素的行、列编号均从1开始。

测试样例:
	输入样例1
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 0 1 1
输出样例1
9 2 3
5 3 2
5 3 4
输入样例2
3 5
2 7 7 4-1
9 3 11 1 12
9 5 3 5 1
输出样例2
None 3 5

#include <stdio.h>
int main(){
	int m,n;
	scanf("%d %d",&m,&n);
	int i = 0,j = 0;
	int a[55][55];
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	int flag = 0;
	for(i=1;i<m-1;i++){
		for(j=1;j<n-1;j++){
			if(a[i][j]>a[i-1][j]&&a[i][j]>a[i+1][j]&&a[i][j]>a[i][j-1]&&a[i][j]>a[i][j+1]){
				printf("%d %d %d\n",a[i][j],i+1,j+1);
				flag = 1;
			}
		}
	}
	if(flag ==0) printf("None %d %d",m,n);
	return 0;
}

选优秀员工

试题名称	5-2选优秀员工
问题描述	
某公司前期选出了N个候选的优秀员工,每位候选者包含员工号(正整数)、业绩([0,100]区间内的整数)和得票数([0,1000]区间内的整数)等信息。
下面需要从这N个候选人中确定最终的优秀员工,规则如下:当候选的优秀员工数不足4人时,得票数最高者为优秀员工;否则,得票数排候选员工前25%(向下取整,即小数部分丢弃)者为优秀员工。
编写程序输出优秀员工的人数,以及所有优秀员工的工号及其得票数。

输入格式:
输入的第一行为一个正整数N(0<N≤20),表示优秀员工候选人数。随后N行,每行给出一位员工的业绩信息和得票信息,格式为“工号业绩票数”,中间以空格分隔。题目保证所有候选员工的得票数互不相同。

输出格式:
第一行输出最终的优秀员工人数;
第二行起每行输出一名优秀员工的工号和得票数,间隔一个空格。按照得票数降序排列。

测试样例:
输入样例13
10001 78 835
10002 92 786
10003 56 455
输出样例11
10001 835

输入样例26
10001 78 835
10002 92 786
10003 56 855
10004 76 455
10005 66 755
10006 80 800
输出样例21
10003 855


#include <stdio.h>
struct employ{
	int num;
	int sale;
	int tick;
}em[100];
int main(){
	int n;
	scanf("%d",&n);
	int i = 0,j=0;
	for(i=0;i<n;i++){
		scanf("%d %d %d",&em[i].num,&em[i].sale,&em[i].tick);
	}
	struct employ temp;
	for(i=0;i<n-1;i++){
		for(j=i+1;j<n;j++){
			if(em[i].tick<em[j].tick){
					temp = em[i];
				em[i]  = em[j];
				em[j] = temp;
			}
		}
	}
   if(n<4){
   	printf("1\n%d %d",em[0].num,em[0].tick);
   }	else if(n>=4){
   	printf("%d\n",n/4);
   	for(i=0;i<n/4;i++){
   		printf("%d %d\n",em[i].num ,em[i].tick);
	   }
   }
	return 0;
}

码字不易,给个👍~我们下一篇博客见!

才疏学浅,个人理解难免有错,欢迎指正。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值