依旧是六个水题,也是最后一次全水题了。
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)。注意,沿山路原路返回的时候,原本是上坡路的路段变成了下坡路,原本是下坡路的路段变成了上坡路。
贝茜想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多远。
我的代码:
整条山路被贝茜划分成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;
}