第三届山西省程序设计大赛:紧急救援

第三届山西省程序设计大赛
题目描述:
紧急救援
时间限制: C/C++ 4000ms; Java 8000ms 内存限制: 65535KB
问题描述

以马卡洛夫为首的极端左派组织控制了俄罗斯绝大部分军事力量和能源,企图独裁整个俄罗斯和欧洲,马卡洛夫凭借军事上的优势,攻占了俄罗斯机场和总统的飞机,策划并绑架了俄罗斯总统及其女儿,挑起了第三次世界大战,整个美国和欧洲都陷入战火之中。上兰村帝国理工大学为了维护世界和平,响应党的号召,准备紧急支援。
这个艰巨的任务当然是落在了爱和平爱正义的SHlong身上。已知支援战略物资都在帝国理工的n个学院中,第i个学院有a[i]个物资。但是由于SHlong有一个比较会搞事情的上司const_bh,他要求SHlong每次需要物资的时候只能在一个学院中取得,并且每次在选取学院的时候得按照const_bh的方法去取。遇上这样的上司,SHlong有点烦恼,但是为了世界和平,为了爱与正义,为了牛奶和面包,他找到了你,你能帮他找到在第几个学院取得物资吗?

输入描述
多组输入。
第一行输入整数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,分别代表三种不同的方法:
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!

这道题一开始就写出来了,然后一直wa不知道为啥,一位自己理解错了题意,后来转头又过来看,发现是多组输入,因为前面题都没要求多组输入,就没在意到这个,改了之后就过 了。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1000+10;
struct node{
    int id;
    int source;    
}a1[maxn];
bool cmp1(node a,node b)  // 
{
     return a.id<b.id;
}
bool cmp2(node a,node b)   //从小到大 
{
     if(a.source!=b.source) return a.source<b.source;
     else return a.id<b.id;
}
bool cmp3(node a,node b)//从大到小 
{
     if(a.source!=b.source) return a.source>b.source;
     else return a.id<b.id;
}
int main()
{
      int n,q;
      int k,x;
      int tmp=0;
      while(scanf("%d",&n)!=EOF)
      {
        for(int i=0;i<n;i++)
        {
             scanf("%d",&a1[i].source) ;
             a1[i].id=i+1;
        }
        scanf("%d",&q);
      while(q--)
      {
         int flag=0;
         scanf("%d%d",&k,&x);

         if(k==1)
         {
           sort(a1,a1+n,cmp3) ;
           if(a1[0].source<x)
           {
               printf("Can't be distributed!\n");
               continue;
           }

           sort(a1,a1+n,cmp1);
           for(int i=0;i<n;i++)
           {
             if(a1[i].source>=x)
             {
               flag=1;
               a1[i].source=a1[i].source-x;
               printf("%d\n",a1[i].id);
               break;
             }
           }
         }
         else if(k==2)
         {
           sort(a1,a1+n,cmp2);
           if(a1[n-1].source<x)
           {
               printf("Can't be distributed!\n");
               continue;
           }
           for(int i=0;i<n;i++)
           {
             if(a1[i].source>=x)
             {
               flag=1;
               a1[i].source=a1[i].source-x;
               printf("%d\n",a1[i].id);
               break;
             }
           }
         } 
         else if(k==3)
         {
           sort(a1,a1+n,cmp3) ;
           if(a1[0].source<x)
           {
               printf("Can't be distributed!\n");
               continue;
           }
           for(int i=0;i<n;i++)
           {
             if(a1[i].source>=x)
             {
               flag=1;
               a1[i].source=a1[i].source-x;
               printf("%d\n",a1[i].id);
               break;
             }
           }     
         }

         if(!flag) printf("Can't be distributed!\n")  ;
      }
      }
      //for(int i=0;i<n;i++)
      //cout<<a2[i].id<<" "<<a2[i].source<<endl;
    //system("pause");
    return 0;
}

虽然卡的不严,但是我这个应该会快一点emmm,稍微排一下再找。
OJ网址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值