第二届新生程序设计竞赛热身赛(C语言)
A:饥饿的XP
XP迷失在X星球,他醒来时已经很久很久很久没有吃过东西了。他突然发现身边有一张地图,上面有X星球上每一个食物供给点的位置。太好了,XP跳了起来。他决定先把肚子填饱再去寻找其他伙伴。现在已知XP的位置(X, Y),以及他的行走速度N(米/分钟),请问他需要多久才能到达最近的食物供给点。
输入
第一行两个正整数N和M,N为XP的行走速度,M为X星球上食物供给点的数量。
第二行两个小数X和Y,表示XP的坐标。
接下来M行,每一行包含两个小数,表示每一个供给点的坐标。
地图中的距离单位为:米。(N,M都为正整数)
-1000<=X,Y<=1000,0<M,N<=500输出
所需时间(单位为分钟,需保留两位小数)。
样例输入 Copy
1 1 0 0 1.0 0样例输出 Copy
1.00
#include <stdio.h>
#include <math.h>
double a[505];
void sort(double a[],int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (a[j] > a[j + 1]) {
double t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
int main() {
int n, m;
double x, y;
while (~scanf("%d%d%lf%lf",&n,&m,&x,&y)) {
double xx, yy;
for (int i = 0; i < m; i++) {
scanf("%lf%lf", &xx, &yy);
a[i] = sqrt((x - xx) * (x - xx) + (y - yy) * (y - yy));
}
sort(a, m);
printf("%.2lf\n", a[0] / n);
}
return 0;
}
B:XP的众数(题目数据有问题,1e5双重for循环能过)
XP想求一个整数数组的众数,即出现次数最多的数。但是有时候一个数组的众数不唯一,因此他希望知道数组中众数的个数。你能不能写个程序帮帮他呢?
输入
每排先输入一个n,表示该组共n个数,随后跟着n个数,表示该数组的每个元素的值
保证每个输入的值x在int范围内且(0 <=n <= 1e5)输出
每排输出一个整数,表示该组数组的众数个数
样例输入 Copy
7 1 2 3 4 2 3 4样例输出 Copy
3
#include <stdio.h>
int a[100005];
int main() {
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n-1;i++){
int t=i;
for(int j=i+1;j<n;j++){
if(a[t]>a[j]){
t=j;
}
}
if(t!=i){
int tt=a[i];
a[i]=a[t];
a[t]=tt;
}
}
int m=0,s=0;
for(int i=0;i<n;i++){
int j=i;
while(j<n-1&&a[j]==a[j+1]){
j++;
}
if(m==j-i+1){
s++;
}
if(m<j-i+1){
m=j-i+1;
s=1;
}
i=j;
}
printf("%d\n",s);
}
return 0;
}
C:ZWH的疑惑
有n个数字,a1,a2.....an,bi=(2^ai)%2147483648,输出所有的b的和 。
输入
首先输入t代表样例数量。
后面每两行代表每一个样例 。
第一行输入一个整数n 。
第二行输入n个整数,代表每一个ai 。
输出
所有b的和 。
数据范围 (1<=t<=500 1<=n<=500 1<=ai<=10000000000 )
样例输入 Copy
1 3 1 2 3样例输出 Copy
14
#include <stdio.h>
#include <math.h>
long long a[505];
int main() {
int t, n;
scanf("%d", &t);
while (t--) {
long long s = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%lld", &a[i]);
for (int i = 0; i < n; i++)
if (a[i] < 31)
s += (long long)pow(2, a[i]);
printf("%lld\n", s);
}
return 0;
}
D:yangftc的时间安排
yangftc需要安排他的时间,有很多事情做,每个事情都有固定的开始和结束时间,因为yangftc每次只能做一件事情,如果有两个或者多个事情的时间重合了那么他就会说 NO,否则他就会说 YES 。
输入
第一个数字t代表样例数量,
后面t个样例,每个样例输入一个n表示事情的数量,后面n行每行两个数字l r表示这个事情的开始和结束时间;
输出
判断yangftc会说什么 YES或者 NO 。
数据范围 1<=t<=500 1<=n<=100 1<=l<=r<=100000
样例输入 Copy
2 3 1 3 4 5 6 7 2 1 3 3 4样例输出 Copy
YES NO
#include <stdio.h>
#include <math.h>
int a[100005];
int main() {
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<100005;i++){
a[i]=0;
}
int l,r;
int f=1;
while(n--){
scanf("%d%d",&l,&r);
for(int i=l;i<=r;i++){
if(a[i]){
f=0;
}
a[i]=1;
}
}
if(f){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}
E:小明同学的签到题
小明同学热爱ACM,因此他每天清晨都会默念N遍HNUCM,并打开HUNCM OJ刷题,现在他要求你打印N个HNUCM字符串。
输入
有多组样例,每行输入一个正整数N(N<=100)
输出
每组数据你只需要输出N个字符串HNUCM即可,每行一个HNUCM。
每组数据后需接一行空行样例输入 Copy
4 5样例输出 Copy
HNUCM HNUCM HNUCM HNUCM HNUCM HNUCM HNUCM HNUCM HNUCM
#include <stdio.h>
#include <math.h>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
printf("HNUCM\n");
}
printf("\n");
}
return 0;
}
F:Yftc的宝石
Yftc来到了一个魔法之城,这个城的城主给了Yftc n片宝石碎片,每片碎片价值ai。
Yftc需要把n颗碎片合并成一颗完整的宝石。每次yftc可以选择相邻的两片合并成一片,合并后这一整块的碎片价值将变为0,并且Yftc获得的价值为两片碎片中价值较大者。
请问,将所有碎片合并成一颗宝石后,Yftc能获得的最大价值。
输入
多组输入,每组输入两行。
第一行,1个整数n(1<=n<=1000) 。
第二行n个整数,代表每片碎片价值ai(1<=ai<=10000) 。
输出
Yftc能够获得的最大价值 。
样例输入 Copy
3 1 2 3样例输出 Copy
5
#include <stdio.h>
#include <math.h>
int a[1000];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int s=0,b=10000;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
s+=a[i];
if(b>a[i]){
b=a[i];
}
}
printf("%d\n",s-b);
}
return 0;
}