[编程题] 奖学金 路灯

来源:互联网 发布:增值税发票模拟软件 编辑:程序博客网 时间:2024/05/18 00:12

一.奖学金


小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。

输入描述:
第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行两个整数ai和bi,均小于等于1e6大于等于1


输出描述:
一行输出答案。

输入例子:
5 10 90 59 18 10 19 100

输出例子:
43

        = = 一开始没写whle(scanf()!=EOF)一直出错,还不知道为什么。后来看了下说明才发现。


#include<stdio.h>#include<algorithm>struct x_t{    int a;    int b;}x[100005];bool cmp(const struct x_t& t1 ,const struct x_t& t2){    return t1.b < t2.b;}int main(){    int n,r,avg;    while(scanf("%d %d %d",&n,&r,&avg)!=EOF){        int score = 0;        for(int i=0;i<n;i++){            scanf("%d %d",&x[i].a,&x[i].b);            score += x[i].a;        }        std::sort(x,x+n,cmp);        int dif;        dif = n*avg - score;        if(dif<0){            printf("0\n");            continue;        }        long long time = 0;        for(int i=0;i<n;i++){            int d = r-x[i].a;            if(dif-d<=0){                time += dif*x[i].b;                break;            }            time += d*x[i].b;            dif -= d;        }        printf("%lld\n",time);    }    return 0;}


二.路灯

一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要是这个d最小,请找到这个最小的d。

输入描述:
每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0)。第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点。


输出描述:
输出答案,保留两位小数。

输入例子:
7 1515 5 3 7 9 14 0

输出例子:
2.50

#include<stdio.h>#include<algorithm>int a[1005];int main(){    int n,l;    while(scanf("%d %d",&n,&l)!=EOF){        for(int i=0;i<n;i++){            scanf("%d",&a[i]);        }        std::sort(a,a+n);        float max = 0;        for(int i=0;i<n-1;i++){            int dif = a[i+1] - a[i];            float ans = 1.0*dif/2;            if(ans>max){                max = ans;            }        }        if(a[0]>max){            max = a[0];        }        if(l-a[n-1]>max){            max = l-a[n-1];        }        printf("%.2f\n",max);    }}


三.小易的编程之路

小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?

输入描述:
对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值.第二行n个整数,b1,b2...bn(1≤bi≤n)表示每个怪物的防御力


输出描述:
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值

输入例子:
3 5050 105 2005 2030 20 15 40 100

输出例子:
110205

#include<stdio.h>int b[100005];int f(int x,int y){    while(y){        int t=y;        y=x%y;        x=t;    }    return x;}int main(){    int n,a;    while(scanf("%d %d",&n,&a)!=EOF){        for(int i=0;i<n;i++){            scanf("%d",&b[i]);        }        for(int i=0;i<n;i++){            if(a<b[i]){                a += f(a,b[i]);            }            else{                a += b[i];            }        }        printf("%d\n",a);    }}


四.炮台攻击


兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格------约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它R的敌人 (两点之间的距离为两点连续的距离,例如(3,0),(0,4)之间的距离是5),如果一个炮台能攻击 到敌人,那么就会对敌人造成1×的伤害.黑默丁格将三个炮台放在N*M方格中的点上,并且给出敌人 的坐标. 问:那么敌人受到伤害会是多大?

输入描述:
第一行9个整数,R,x1,y1,x2,y2,x3,y3,x0,y0.R代表炮台攻击的最大距离,(x1,y1),(x2,y2),(x3,y3)代表三个炮台的坐标.(x0,y0)代表敌人的坐标.


输出描述:
输出一行,这一行代表敌人承受的最大伤害,(如果每个炮台都不能攻击到敌人,输出0×)

输入例子:
1 1 1 2 2 3 3 1 2

输出例子:
2x

#include<stdio.h>int main(){    int r,x1,y1,x2,y2,x3,y3,x0,y0;    while(scanf("%d %d %d %d %d %d %d %d %d"                ,&r,&x1,&y1,&x2,&y2,&x3,&y3,&x0,&y0)!=EOF){        int damage = 0;        if((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1)<=r*r){            damage += 1;        }        if((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)<=r*r){            damage += 1;        }        if((x0-x3)*(x0-x3)+(y0-y3)*(y0-y3)<=r*r){            damage += 1;        }        printf("%dx\n",damage);    }}


五.扫描透镜


在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?
注意:每个方格被扫描一次只能清除掉一个蘑菇。 

输入描述:
第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小;接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇.一个方格可以种无穷个蘑菇.


输出描述:
输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇.

#include<stdio.h>#include<stdlib.h>#include<string.h>int a[25][25];int dx[] = {-1,0,1,-1,0,1,-1,0,1};int dy[] = {-1,0,1,1,-1,0,0,1,-1};int main(){    int n,m,k;    while(scanf("%d %d %d",&n,&m,&k)!=EOF){        memset(a,0,sizeof(a));        for(int i=0;i<k;i++){            int x,y;            scanf("%d %d",&x,&y);            a[x][y]++;        }        int ans = 0;        for(int times=0;times<2;times++){            int max = 0;            int count;            int index_i = 0 ,index_j = 0;            for(int i=1;i<=n;i++){                for(int j=1;j<=m;j++){                     count = 0;                    for(int t=0;t<9;t++){                         if(a[i+dx[t]][j+dy[t]]>0)count++;                    }                    if(count>max){                        max = count;                        index_i = i;                        index_j = j;                    }                }            }            for(int t=0;t<9;t++){                if(a[index_i+dx[t]][index_j+dy[t]]>0){                    a[index_i+dx[t]][index_j+dy[t]]--;                    ans++;                }            }        }        printf("%d\n",ans);    }}



0 0