【嵙大】大一上期中考试复现 2410 1636 1505 1705 2561 1422 13101303 1630 1631 1936 2219


全标题

Problem IDTitle
Y2410 Problem A百分比
Y1636 Problem B测量风力
Y1505 Problem C最接近的偶数(Append Code)
Y1705 Problem D收入支出的和
Y2561 Problem E直角三角形
Y1422 Problem F两两相加和的最大值
1310 Problem G一共多少天
Y1303 Problem H方程组的解数
1630 Problem I测验
Y1631 Problem J全排列
1936 Problem K选举总统
2219 Problem L数组的平滑

summary:

前五道题很简单(虽然有小坑),第六道题也不难但是不用数组只用两个变量在考场上不是很好想 ,进

1. 百分比 2410有除数

注意分母为0的情况 以及这道题目是明确说了先输入n后输入m的

#include <stdio.h>
#include <stdlib.h>

//Problem A: 百分比
//Time Limit: 1 Sec  Memory Limit: 16 MB
//Submit: 6257  Solved: 4402
//[Submit][Status]
//Description
//求m占n的百分比,精确到小数点后4位。
//Input
//输入两个整数n和m。
//Output
//以百分比的形式输出m/n,精确到小数点后4位。
//Sample Input
//3 5
//Sample Output
//166.6667%
//HINT
//用%%可以输出“%”。
int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	if(m==0 || n==0)
		printf("0.0000%%");
	else
	{
		double c=m*1.0/n;
		printf("%.4f%%",c*100);	
	}	
	return 0;
}

2.1636 测量风力

#include <stdio.h>
#include <stdlib.h>

//Problem B: 测量风力
//Time Limit: 1 Sec  Memory Limit: 128 MB
//Submit: 6183  Solved: 3179
//[Submit][Status]
//Description
//下面的表格是用于测量风力的蒲福风力等级的简化版本
//-----------------------------------------------------------------------------
//         速率(海里/小时)              描述
//-----------------------------------------------------------------------------
//	    小于1                       Calm(无风)
//	    1~3                         Light air(轻风)
//	    4~27                       Breeze(微风)
//	    28~47                     Gale(大风)
//	    48~63                     Storm(暴风)
//	    大于63                     Hurricane(飓风)
//-----------------------------------------------------------------------------
//编写一个程序,要求用户输入风速(海里/小时), 然后显示相应的描述。
//-----------------------------------------------------------------------------
//Input
//输入一个大于等于0的整型数据N,该数据表示1个速率值(海里/小时) 。
//Output
//输出这个数据N所对应的英文描述,不必输出描述的括号及中文部分。
//
//Sample Input
//2
//Sample Output
//Light air
//HINT

int main()
{
	int n;
	scanf("%d",&n);
	    if(n==0)
	    	printf("Calm\n");
	    else if(n>=1 && n<=3)
	    	printf("Light air\n");
	    else if(n>=4 && n<=27)
	    	printf("Breeze\n");
	    else if(n>=28 && n<=47)
	    	printf("Gale\n");			
	    else if(n>=48 && n<=63)
	    	printf("Storm\n");			
	    else if(n>63)
	    	printf("Hurricane\n");									
	return 0;
}

3.1505 最接近的偶数

#include <stdio.h>
#include <stdlib.h>
//Problem C: 最接近的偶数(Append Code)
//Time Limit: 1 Sec  Memory Limit: 128 MB
//Submit: 3280  Solved: 1458
//[Submit][Status]
//Description
//编写一个函数:
//
//int nearest(int n);
//
//用于求不大于n的最大偶数,并作为函数的返回值进行返回。
//
//Input
//是一个int范围内的整数n。
//
//Output
//输出不大于n的最大偶数。
//
//Sample Input
//5
//Sample Output
//4
//HINT
//Append Code
 
int nearest(int n)
{
    if(n%2==0)
        return n;
    else
        return n-1; 
 } 
 
int main()
{
    int m,n;
    scanf("%d",&m);
    n = nearest(m);
    printf("%d",n);
    return 0;
}

4.1705 收入支出的和

#include <stdio.h>
#include <stdlib.h>
 
 
 
 
//简单记帐时用收入记为正数,支出记为负数,现在要求出收入总和和支出总和。
//首先输入n(n>=0),然后输入n个整数。正数为收入,负数为支出。
//输出两个整数,分别是收入与支出的总和。
//5
//100 20 -50 200 -400
//Sample Output
//320 -450
 
int main()
{
    int sumz=0,sumf=0;
    int n;
    scanf("%d",&n);
    int m=0;
    while(n>0)
    {
        n--;
        scanf("%d",&m);
        if(m>0)
            sumz+=m;
        else
            sumf+=m;
    }
    printf("%d %d",sumz,sumf);
    return 0;
}

5.2561 打印直角三角形

#include <stdio.h>
#include <stdlib.h>
 
 
//输入一个正整数N,输出一个N行“+”组成的直角三角形。
//
//Input
//一个正整数N。
//
//Output
//一个N行“+”组成的直角三角形,直角边在左边和下面。
//
//Sample Input
//5
//Sample Output
//+
//++
//+++
//++++
//+++++
//HINT
 
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    int j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=i;j++)
        {
            printf("+");
         } 
        printf("\n");
    }
    return 0;
}

6.1422  两两相加和的最大值

注意maxsum的初始值设置 以及这道题其实不用数组

#include <stdio.h>
#include <stdlib.h>
 
 
 
//对于输入的N个数a1,a2,a3,...,aN,
//分别求ai+ai+1(i=1,2,...,N-1)和,
//输出其中和最大的两个数及其和。
//
//Input
//输入只有一行。
//第一个整数N>1表示后面有N个整数。
//之后会有N个整数,他们两两之和均不超出int类型的表示范围。
//所有输入的整数两两之间用空格隔开。
//
//Output
//输出只有一行,格式为:
//
//x + y = z
//
//其中x和y是和最大的两个数,z是x和y的和。
//
//如果有多个解,则输出自左边起的第一对数及其和。
//
//Sample Input
//10 1 2 3 4 5 6 7 8 9 10
//Sample Output
//9 + 10 = 19
//HINT
//Append Code
 
 
 
 
int main()
{
    int a,b;
    int n,i;
    scanf("%d",&n);
    scanf("%d",&a);//输入第一个数 
    int maxa=a,maxb=0;
    int maxsum=-100000;//这里maxsum的初始值是关键 如果输入中有负数,,, 
    for(i=1;i<n;i++)
    {
        scanf("%d",&b);//输入第二个数 
        int c=a+b;
        if(c>maxsum)
            {
                maxsum=c;
                maxa=a;
                maxb=b;
            }
        a=b; 
    }
    printf("%d + %d = %d\n",maxa,maxb,maxsum);
//printf("%d + %d = %d\n",t,a,c);
    return 0;
}

7.1310 一共多少天

8.1303 方程组的解数

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//最大的问题是(a,b)与(b,a)算一组还是两组?
//由测试用例可知算作一组 所以要去除重复影响 
//找测试用例是先射击在画靶 先随便找个ab然后把mn确定下来 
int main()
{
	int m,n;
	int i,j; 
	int cnt=0;//不要忘记清零 
	while(scanf("%d %d",&m,&n)!=EOF)
	{
		cnt=0; 
		for(i=0;i<=sqrt(m);i++)
		{
			for(j=0;j<=sqrt(n);j++)
			{
				if((i*i+j)==m && (j*j+i)==n)
				{
					cnt++;
//					printf("%d %d\n",i,j);
				}
			}
		}
		printf("%d\n",cnt);
	}
	return 0;
 } 

9.1630 测验

10.1631 全排列

//gpt第二次
#include <stdio.h>

#define MOD 1000000007

// 计算阶乘模
int quanpailie(int n) {
    int ret = 1;
    int i;
    for (i = 1; i <= n; i++) {
        ret = (1LL * ret * i) % MOD; // 确保不溢出
    }
    return ret;
}

int main() {
    int n;

    // 输入直到 EOF
    while (scanf("%d", &n) != EOF) {
        int s[1001] = {0};
        int i;
        for (i = 0; i < n; i++) {
            scanf("%d", &s[i]);
        }

        int sum = 0;
        int used[1001] = {0}; // 记录是否已使用的数字
        for (i = 0; i < n; i++) {
            int cnt = 0;
            int j;
            for (j = 1; j < s[i]; j++) { // 统计比 s[i] 小且未使用的数字
                if (!used[j]) {
                    cnt++;
                }
            }
            sum = (sum + 1LL * cnt * quanpailie(n - i - 1) % MOD) % MOD;
            used[s[i]] = 1; // 标记当前数字已使用
        }

        printf("%d\n", (sum + 1) % MOD); // 输出排名
    }

    return 0;
}
gpt第一次 一半通过率
gpt的思路和我一样 不过它计算的是比当前排序小的所有顺序个数
//
//#include <stdio.h>
//
//#define MOD 1000000007
//
 计算阶乘模
//int quanpailie(int n) {
//    int ret = 1;
//    int i=0;
//    for (i = 1; i <= n; i++) {
//        ret = (ret * i) % MOD;
//    }
//    return ret;
//}
//
//int main() {
//    int n;
//
//    // 输入直到 EOF
//    while (scanf("%d", &n) != EOF) {
//        int s[1001] = {0};
//        int i=0;
//        for (i = 0; i < n; i++) {
//            scanf("%d", &s[i]);
//        }
//
//        int sum = 0;
//        int used[1001] = {0}; // 记录是否已使用的数字
//
//        for ( i = 0; i < n; i++) {
//            int cnt = 0;
//            int j;
//            for ( j = 1; j < s[i]; j++) { // 统计比 s[i] 小且未使用的数字
//                if (!used[j]) {
//                    cnt++;
//                }
//            }
//            sum = (sum + cnt * quanpailie(n - i - 1)) % MOD;
//            used[s[i]] = 1; // 标记当前数字已使用
//        }
//
//        printf("%d\n", (sum + 1) % MOD); // 输出排名
//    }
//
//    return 0;
//}
我的代码(原始):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//Description
//小K周末参加了一个娱乐活动。
//在这个活动中,主持人选出n个人,并将这些人从1到n编号,让他们组成一个排列。
//如果按字典序来排列,这n个人的排列是第几个?结果可能很大,
//你只需要输出模1000000007的结果就OK了。
//For example
//1 2 3 -> 1
//1 3 2 -> 2
//2 1 3 -> 3
//2 3 1 -> 4
//3 1 2 -> 5
//3 2 1 -> 6
//
//Input
//多组数据
//每组第一行输入一个整数n(0<n<=1000)
//每组第二行输入一个1——n的排列
//
//Output
//每组输出一行,包含一个正整数,
//表示排列的顺序数模1000000007的结果
//
//Sample Input
//3
//1 2 3
//Sample Output
//1



#define MOD 1000000007
//其实不用把所有排列顺序都找出来 
//一个全排列函数 
int quanpailie(int n)
{
	int ret=n;
	int i;
	for(i=n-1;i>1;i--)//比较重要的是这个for循环的处理方式 
	{
		ret=(ret*i)%MOD;//这里每次都要取模 
	}
	return ret;
 } 
// //用来测试全排列函数是否正确运行 
//int main()
//{
//	int a=0;
//	int n=0;
//	scanf("%d",&n); 
//	a=quanpailie(n);
//	printf("%d",a); 
//	return 0;
// } 

int main()
{
	int n;
	scanf("%d",&n);
	while(scanf("%d",&n)!=EOF)
	{
		
	int s[1001]={0};
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%d",&s[i]);
	 } 
	int sum=0;
	int j;
	for(i=0;i<n;i++)
	{
		int cnt=0;
		for(j=i+1;j<n;j++)//我这里算的是比现在排序大的排序 
		{
			if(s[j]>s[i])
			{
					cnt++;
					printf("%d %d\n",s[i],s[j]);
			}	
		}
		int c=quanpailie(n-i-1);
//		printf("n-i-1=%d %d\n",n-i-1,c);
		sum+=cnt*c;
	}
	int d=quanpailie(n);//全排列的所有可能减去比现在排序大的可能就是现在排序的位置 
//	printf("%d\n",d); 
	printf("%d\n",d-sum);	
	}

	return 0;
 } 
提交上去出现了一个 Output Limit Exceed//超出输出限制

几个关键问题:

1.mod要用在哪里?

2.怎么计算当前顺序在字典序里的位置?

3.如何防止数据溢出?

11.1936 选举总统

12.2219 数组的平滑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值