2018-5-5 :3 紧急救援

问题描述

timg (1).jpg

    以马卡洛夫为首的极端左派组织控制了俄罗斯绝大部分军事力量和能源,企图独裁整个俄罗斯和欧洲,马卡洛夫凭借军事上的优势,攻占了俄罗斯机场和总统的飞机,策划并绑架了俄罗斯总统及其女儿,挑起了第三次世界大战,整个美国和欧洲都陷入战火之中。上兰村帝国理工大学为了维护世界和平,响应党的号召,准备紧急支援。

    这个艰巨的任务当然是落在了爱和平爱正义的SHlong身上。已知支援战略物资都在帝国理工的n个学院中,第i个学院有a[i]个物资。但是由于SHlong有一个比较会搞事情的上司const_bh,他要求SHlong每次需要物资的时候只能在一个学院中取得,并且每次在选取学院的时候得按照const_bh的方法去取。遇上这样的上司,SHlong有点烦恼,但是为了世界和平,为了爱与正义,为了牛奶和面包,他找到了你,你能帮他找到在第几个学院取得物资吗?

timg (2).jpg

输入描述

多组输入。

第一行输入整数n(1 <= n <= 1000),表示人民兵工第一校的n个学院

第二行输入n个整数a[i],a[i]表示第i个学院的物资数目。(1 <= a[i] <= 1000)

第三行输入整数q,代表q次询问(1 <= q <= 100)

接下来输入q行,每一行输入整数k和x,代表用第k种方法去找学院获得物资。

k的取值为1,2,3,分别代表三种不同的方法:

扫描二维码关注公众号,回复: 1041569 查看本文章

k=1 首次适应算法  从第一个学院起查找,把最先能够满足要求(学院资源  >= 所需资源 )的学院代号输出。

k=2 最佳适应算法  从第一个学院起查找,把能够满足要求(学院资源  >= 所需资源 ) 并且 学院资源最少的学院代号输出,如果有多个,输出编号最小的学院。

k=3 最差适应算法  从第一个学院起查找,把能够满足要求(学院资源  >= 所需资源 ) 并且 学院资源最多的学院代号输出,如果有多个,输出编号最小的学院。

x为所需的物资数目。


输出描述

对于每对k  x,输出占一行。

若能分配,输出物资分配的学院代号。

若不能,输出“Can't be distributed!”


样例输入
样例1输入:
5
5 4 3 2 1
3
3 2
1 2
2 2
样例2输入:
4
1 2 3 5 
2
1 4
3 4
样例输出
样例1输出:
1
1
4
样例2输出:
4
Can't be distributed!
来源
第三届山西省大学生程序设计大赛
提示

此题输入数据较多,建议使用scanf和printf进行输入输出。

我猜啊,这个题有坑,因为我做不出来,我也找不到这个坑
#include<stdio.h>
#include<string.h>
int x,m,i,b,n,k,q;
int a[1001];
void find1(int x){
    m=0;
    for(i=1;i<=n;i++)
        if(a[i]>=x){
            m=i;
            break;
    }
    a[m]-=x;
    if(m!=0)
        printf("%d\n",m);
    else
        printf("Can't be distributed!\n");

}
void find2(int x){
    b=1000;
    m=0;
    for(i=1;i<=n;i++){
        if(a[i]>=x){
            if(a[i]<b){
                b=a[i];
                m=i;
            }
        }
    }
    a[m]-=x;
    if(m!=0)
        printf("%d\n",m);
    else
        printf("Can't be distributed!\n");

}
void find3(int x){
    m=0;
    b=0;
    for(i=1;i<=n;i++){
        if(a[i]>=x){
            if(b<a[i]){
                b=a[i];
                m=i;
            }
        }
    }
    a[m]-=x;
    if(m!=0)
        printf("%d\n",m);
    else
        printf("Can't be distributed!\n");

}

int main(void){

    scanf("%d",&n);
    memset(a,0,sizeof(a));
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    scanf("%d",&q);
    while(q){
        scanf("%d%d",&k,&x);
        if(x==0)
            printf("1\n");
        else{
            if(k==1)
                find1(x);
            if(k==2)
                find2(x);
            if(k==3)
                find3(x);
        }

        q--;

    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/han_hhh/article/details/80206416