QUST每周训练2

本周的ACM训练包含了6道题目,包括第K极值问题,越野跑,津津的储蓄计划,Humidex公式,计算偶数位数字之和以及子网掩码判断。在第K极值问题中,需要找到序列中第k大的和第k小的数字之差,并检查这个差值是否为质数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依旧是六个水题,也是最后一次全水题了。

Problem A: 第K极值

Description

        给定一个长度为N(0< n< =10000)的序列,保证每一个序列中的数字a[i]是小于maxlongint的非负整数  ,编程要求求出整个序列中第k大的数字减去第k小的数字的值m,并判断m是否为质数。(0< k< =n)

我的代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
	long int a[10001];
    long int sqrt_;
    int n,k;
    bool flag;
    int m;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
    	cin>>a[i];
    }
    sort(a+1,a+n+1);
    m=a[n-k+1]-a[k];
    sqrt_=sqrt(m);
    flag=false;
    for(int i=2;i<=sqrt_;i++)
    {
    	if(m%i==0)
        {
        	flag=true;break;
        }
    }
    if(flag||m<0)
    cout<<"NO"<<endl;
    else
    cout<<"YES"<<endl;
    cout<<m;
    return 0;
}

Problem B: 越野跑

    为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练。贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:奶牛独自进山的时间不得超过M秒(1 <= M <= 10,000,000)。

  整条山路被贝茜划分成T个长度相同的小段(1 <= T <= 100,000),并且,贝茜用S_i表示第i个小段的路况。S_i为u,f,d这3个字母之一,它们分别表示第i个小段是上坡、平地,或是下坡。

    贝茜要花U秒(1 <= U <= 100)才能跑完一段上坡路,跑完一段平地的耗时是F秒(1 <= F <= 100),跑完一段下坡路要花D秒(1 <= D <= 100)。注意,沿山路原路返回的时候,原本是上坡路的路段变成了下坡路,原本是下坡路的路段变成了上坡路。

 贝茜想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多远。
我的代码:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int time,n,up,run,down,sum,limit;
	char temp;
	int mountain[100001];
	cin>>time>>n>>up>>run>>down;
	for(int i=1;i<=n;i++)
	{
		cin>>temp;
		switch (temp)
		{
			case 'u' :mountain[i]=up+down;break;
			case 'f' :mountain[i]=2*run;break;
			case 'd' :mountain[i]=up+down;break;
			default:break;
		}
	}
	sum=0;
	limit=0;
	for(int i=1;i<=n;i++)
	{
		sum+=mountain[i];
		if(sum>time)
		{
			limit=i-1;break;
		}
		if(i==n&&sum<=time)
		{
			limit=n;break;
		}
	}
	cout<<limit;
	return 0;
}

Problem C: 津津的储蓄计划

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。 

    为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。 

    例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。 

    津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。 

    现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。 

我的代码:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
    int i, a;
    int have = 0;
    int save = 0;
    for(i = 1; i <= 12; i++){
        scanf("%d", &a);
        have = have + 300 - a;
        if(have < 0)
        {
            printf("-%d\n", i);
            return 0;
        }
        save += have / 100;
        have %= 100;
    }
    printf("%d\n", have + save * 120);
    return 0;
}

Problem D: Humidex

题目关键字:

The humidex formula is as follows:

humidex = temperature + h
h = (0.5555)× (e - 10.0)
e = 6.11 × exp [5417.7530 × ((1/273.16) - (1/(dewpoint+273.16)))]
where exp(x) is 2.718281828 raised to the exponent x
虽然是英文,但是公式都给出了,水水水
我的代码:
#include<stdio.h>
#include<math.h>
#define M 2.718281828
  int main()
  {
   double hu,te,h,e,de,a,b,m;
   char c,d;
   while(scanf("%c",&c)!=EOF,c!='E')
   {
                scanf("%lf %c %lf",&a,&d,&b);
                if(c=='T'&&d=='D')
                {
     te=a;de=b;
     m=5417.7530 *((1/273.16)-(1/(de+273.16)));
     e=6.11*pow(M,m);
     h=0.5555*(e-10.0);
     hu=te+h;
     printf("T %.1f D %.1f H %.1f\n",te,de,hu);
                }
                else if(c=='D'&&d=='H')
                {
     de=a;hu=b;
     m=5417.7530 *((1/273.16)-(1/(de+273.16)));
     e=6.11*pow(M,m);
     h=0.5555*(e-10.0);
     te=hu-h;
     printf("T %.1f D %.1f H %.1f\n",te,de,hu);
                }
                else if(c=='D'&&d=='T')
                {
     te=b;de=a;
     m=5417.7530 *((1/273.16)-(1/(de+273.16)));
     e=6.11*pow(M,m);
     h=0.5555*(e-10.0);
     hu=te+h;
     printf("T %.1f D %.1f H %.1f\n",te,de,hu);
                }
                else if(c=='H'&&d=='D')
                {
     de=b;hu=a;
     m=5417.7530 *((1/273.16)-(1/(de+273.16)));
     e=6.11*pow(M,m);
     h=0.5555*(e-10.0);
     te=hu-h;
     printf("T %.1f D %.1f H %.1f\n",te,de,hu);
                }
                else if(c=='T'&&d=='H')
                {
     te=a;hu=b;
     h=hu-te;
     e=h/0.5555+10.0;
     m=log(e/6.11);
     de=1/(1/273.16-m/5417.7530)-273.16;
     printf("T %.1f D %.1f H %.1f\n",te,de,hu);
                }
                else if(c=='H'&&d=='T')
                {
     te=b;hu=a;
     h=hu-te;
     e=h/0.5555+10.0;
     m=log(e/6.11);
     de=1/(1/273.16-m/5417.7530)-273.16;
     printf("T %.1f D %.1f H %.1f\n",te,de,hu);
                }
   }
   return 0;
  }

Problem E: 奇怪的信

题目描述

有一天, 小明收到一张奇怪的信, 信上要小明计算出给定数各个位上数字为偶数的和。
例如:5548,结果为12,等于 4 + 8 。
小明很苦恼,想请你帮忙解决这个问题。

我的代码:
#include<stdio.h>
#include<math.h>
int main()
{
	int c,i,sum;
	long long tmp,p;
	while (scanf("%d",&tmp)!=EOF)
	{
		sum=0;
		for(i=31;i>=0;i--)
		{	
			p=pow(10,i);
			c=tmp/p;
			tmp=tmp-c*p;
			if(c%2==0)
			{
				sum+=c;
			}
			
		}
		printf("%d\n\n",sum);
		
	}
	return 0;
}

Problem F: 子网掩码

计算并输出N个IP地址是否与本机在同一子网内。对于在同一子网的输出“INNER”,对于在不同子网的输出“OUTER”。

我的代码:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int ip[4];
    scanf("%d.%d.%d.%d", ip, ip+1, ip+2, ip+3);
    int sm[4];
    scanf("%d.%d.%d.%d", sm, sm+1, sm+2, sm+3);

    int standard[4];
    for (int i=0; i<4; i++)
    {
        standard[i] = ip[i] & sm[i];
    }

    int n;
    cin >> n;
    for (int i=0; i<n; ++i)
    {
        bool flag = true;
        int temp[4];
        scanf("%d.%d.%d.%d", temp, temp+1, temp+2, temp+3);
        for (int i=0; i<4; i++)
        {
            if (standard[i] != (temp[i] & sm[i]))
            {
                cout << "OUTER" << endl;
                flag = false;
                break;
            }
        }
        if (flag)
            cout << "INNER" << endl;
    }

    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值