视频:bandicam 2020-11-26.mp4

Problem G: 零起点学算法83——数组中删数
Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 34533  Solved: 10815
Description
在给定的数组中删除一个数

Input
多组测试,每组第一行输入1个整数n(n<20),然后是n个整数 第二行输入1个整数m

Output
删除在第一行的n个整数中第一次出现数字m并删除,然后按照顺序输出剩下的数, 最后一个数后面无空格

Sample Input
4 1 2 3 4
3
Sample Output
1 2 4
HINT
m有可能在原数组中找不到,找不到则输出原数组

#include <stdio.h>

int main()
{
int n,i,k,a[20],m;
while(scanf("%d",&n)!=EOF)
{
    for(i=0;i<n;i++) scanf("%d",&a[i]);
    scanf("%d",&m);
    //查找过程
    for(i=0;i<n;i++)
    {
        if(a[i]==m)
        break;
    } 
    //如果查找到相同的,则下标即为重复值的下标
    //遍历输出
    for(k=0;k<n;k++) //这里用k保证i的值不被改变
    {
        if(k==i)
        {
            
        }
        else
        {
            if(i==n-1&&k==n-2){printf("%d",a[k]);break;}
            if(k==n-1) printf("%d",a[k]);
            else printf("%d ",a[k]);    
        }
        //最后一个数后面无空格,我这里写复杂了,可以用一个新数组替换
    } 
    printf("\n");
}

return 0;
}

小能:
当重复的数是数组最后一个数的时候,当k下标是最后一个数的前一个数,输出 不包含空格的数,然后退出循环

小能:
if(i==n-1&&k==n-2){printf("%d",a[k]);break;}

小能:
if(k==n-1) printf("%d",a[k]);
      else printf("%d ",a[k]);   当重复的数不是最后一个数的时候,执行如下的

小能:
这个你应该看得懂

Problem I: 零起点学算法86——Fibonacc
Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 12801  Solved: 6916
Description
Fibonacci数列定义为(1,1,2,3,5,8,.....),即每个元素是前两个元素的和。如果一个Fibonacci数与所有小于它的Fibonacci数互质,那么称之为Fibonacci质数。 现在要求你输出前n个Fibonacci数 The Fibonacci Numbers {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ...} are defined by the recurrence: F(0)=0 F(1)=1 F(i)=F(i-1)+F(i-2) Write a program to calculate the Fibonacci Numbers.
Input
The first line of the input file contains a single integer T, the number of test cases. The following T lines,each contains an integer n ( 0 <= n <= 45 ), and you are expected to calculate Fn.
Output
Output Fn on a separate line.
Sample Input
5
0
3
5
9
20
Sample Output
0
2
5
34
6765

#include <stdio.h>

int main()
{
int n,i,k,a[46] = {0,1,1};
for(i = 3;i<=45;i++)
{
 a[i] = a[i-1] + a[i-2];
}
scanf("%d",&n);
for(i=0;i<n;i++)
{
 scanf("%d",&k);
    printf("%d\n",a[k]);
}
return 0;
}

Problem K: 零起点学算法88——青年歌手大奖赛_评委会打分

Description
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。

Input
输入数据有多组,每组占一行,每行的第一个数是n(2 < n <= 100),表示评委的人数,然后是n个评委的打分。
Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。

Sample Input
3 99 98 97
4 100 99 98 97

Sample Output
98.00
98.50

#include<stdio.h>

int main(void)
{
float ave=0,sum=0;
int a[100],n,i,m,max=0,min=0;
    while(scanf("%d",&n)!=EOF)
    {
    sum =0;
    max =0; //因为没有归零化导致的问题 
    min =0;
    for(i = 0;i<n;i++)
    {
    scanf("%d",&a[i]);
    sum += a[i];
    }
    
    for(i = 1;i<n;i++)
    {
        if(a[max]<a[i])
        max = i;
        if(a[min]>a[i])
        min = i;
    }
    sum = sum - a[max] - a[min];    
    ave = (float)sum / (n-2);
    printf("%.2f\n",ave);
    }
        return 0;
}
其他答案
#include<stdio.h>
int main()
{
    int n,i,qu,max,min;
    float ave,s,a[200]={0};
    while(scanf("%d",&qu)!=EOF)
    {
        s=0;
        for(i=1;i<=qu;i++)
        {
            scanf("%f",&a[i]);
            s=s+a[i];
        }
        max=1;
        min=1;
        for(i=2;i<=qu;i++)
        {
            if(a[i]>a[max])
            {
                max=i;
            }
            if(a[i]<a[min])
            {
                min=i;
            }
        }
        s=s-a[max]-a[min];
        ave=s/(qu-2);
        printf("%.2f\n",ave);
    }
    return 0;
}

#include<stdio.h>
int main(void)
{
    int a[100],n,i;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
        int max,min;
        max=a[0];
        min=a[0];
        for(i=0;i<n;i++)
        {
            if(max<a[i])  
            max=a[i];
            if(min>a[i])
            min=a[i];
        }
        int s=0;
        for(i=0;i<n;i++)
        {
            s+=a[i];
        }
        printf("%.2f",(s-max-min)*1.0/(n-2));
        printf("\n");
    }
    return 0;
} 

Problem J: 零起点学算法87——打印所有低于平均分的分数
Description
输入n个成绩,打印出所有低于平均分的分数(注意:ave = s/n中s 为float或ave = (float)s/n)。

Input
多个测试数据每个测试数据一行,在这行中先输入分数的个数n(1<=n<=100),然后紧跟着输入n个整数(代表分数)

Output
对于每个测试数据,输出一行按照输入顺序输出所有低于(<)平均分的分数,中间用一个空格隔开,如果没有低于平均分的那么只输出一个空行

Sample Input
3 40 50 60
2 90 80
5 10 10 90 80 80
Sample Output
40
80
10 10

#include <stdio.h>

int main()
{
float avg=0;
int a[100],b[100],n,i,sum=0;
    while(scanf("%d",&n)!=EOF)
    {
    sum = 0; 
    for(i = 0;i<n;i++)
    {
    scanf("%d",&a[i]);
    sum += a[i];
    }
    
    avg = (float)sum / n;
    int k = 0,b[100];
    for(i = 0;i<n;i++)
    {
    if(a[i]<avg)
    {
    b[k] = a[i];
    k++;
    }
    }
    if(k==0)
    printf("\n");
    else
    for(int i = 0;i<k;i++)
    {
        if(i!=k-1)
        printf("%d ",b[i]);
        else
        printf("%d\n",b[i]);
    }
    
    
    }
}
Problem L: 过桥问题
Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 5054  Solved: 1103
Description
在漆黑的夜里,n位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,他们一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,每人所需要的时间分别是a1、a2、...an分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这些人尽快过桥。

Input
多组测试,输入分2行第一行是一个整数n(1<=n<=1000) 第二行是n个整数,分别表示这n个人单独过桥需要的时间

Output
输出一行,他们过桥需要的总时间

Sample Input
5
1 3 6 8 12
Sample Output
29

#include<stdio.h>

int main()
{
int i,j,a[100],b,c,n;
while(scanf("%d",&n)!=EOF)
{
    for(i =0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]>a[j])
            {
                b=a[i];
                a[i]=a[j];
                a[j]=b;
            }
        }
    }
    
    int s =0;
    if(n%2==0)
    {
        for(i=1;i<n;i=i+2)
        {
            s=s+a[i];
        }
        printf("%d\n",s+(n-2)*a[1]+(n-2)*a[0]/2);
    }
else 
{
    for(i=0;i<n;i=i+2)
    {
        s=s+a[i];
    }
    printf("%d\n",s+(n-3)*a[1]+a[0]*(n-3)/2+a[1]);
}

}
return 0; 
} 

标签: none

仅有一条评论

  1. 啊哈哈 啊哈哈

    大神

添加新评论