6 solutions

  • 1
    @ 2021-10-17 19:30:11

    题解

    这个题看似属于分开看挺难,整体看就还好,先按照每天的僵尸都会收取,然后算出每只僵尸会吃脑子的总数,然后存入数组,在从小到大进行排序,最后从小到大加僵尸会吃的脑子总数和所拥有的脑子总数进行比较,保证吃的比拥有的少即可,顺便统计将是个数并输出,上代码:

    代码

    #include<bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<iomanip>
    using namespace std;
    int x[100000000],y[17];
    char a[11],b[18];
    struct Main{
    	char a[20];
    	int cheng;
    }pp[300];
    int cmp(Main x,Main y){
    	return x.cheng>y.cheng;
    }
    int main()
    {
    	int n,m,tian,shu=0;
    	cin>>n>>m;
    	tian=n;
    	for(int i=1;i<=n;i++){
    		int jiang;
    		cin>>jiang;
    		x[i]=jiang*tian;//每只僵尸会吃脑子的总数
    		//cout<<x[i]<<endl;
    		tian--;
    	} 
    	sort(x+1,x+n+1);//排序
    	for(int i=1;i<=n;i++){
    		shu+=x[i];
    		if(shu>m){//比较吃的脑子和你的库存
    			cout<<i-1<<endl;
    			break;
    		}
    	}
    	if(shu<=m){
    		cout<<n<<endl;
    	} 
    	return 0;
    }
    
    • 0
      @ 2021-10-18 0:45:39

      题解

      第三章本来就是排序的一章,所以很容易想到排序,而且题目要求最多的僵尸,需要注意的是收养了僵尸之后就需要一直养到最后,所以将僵尸们从收养的那天到最后一天需要的脑子排序就行,记得不要超过学姐所拥有脑子的个数。

      代码

      代码都差不多,免了吧就。

      • 0
        @ 2021-10-17 23:47:37

        出题人在此

        注意僵尸收养了之后就要对它负责到底一直喂养,别的没啥卡点,直接每个僵尸可能消耗的 脑子数排序就好

        上代码

        #include<bits/stdc++.h>
        using namespace std;
        int main()
        {
        	int n,x,a[1005]={0},cnt=0,sum=0;
        	scanf("%d %d",&n,&x);
        	for(int i=1;i<=n;i++)
        	{
        		scanf("%d",&a[i]);
        		a[i]=a[i]*(n-i+1);
        	}
        	sort(a+1,a+n+1);
        	for(int i=1;i<=n;i++)
        	{
        		if(sum+a[i]<=x)cnt++,sum=sum+a[i];
        		else break;
        	}
        	printf("%d",cnt);
        	return 0;
        }
        
        • 0
          @ 2021-10-17 14:36:57

          这题需要注意的是当养了一只僵尸后,这只僵尸就要一直被养下去,他需要的消耗是从他来的那天开始一直到不养他的那天,为提高收养量,需将收养成本降到最小,即在有限成本条件下,将消耗排序

          #include<cstdio>
          #include<iostream>
          #include<algorithm>
          using namespace std;
          const int N=1e3+10;
          int a[N];
          int main(){
          	int n,sum,ans=0;
          	cin>>n>>sum;
          	for(int i=1;i<=n;i++)
          	{
          		cin>>a[i];
          		a[i]*=(n-i+1);
          	}
          	sort(a+1,a+n+1);
              while(ans<n){
          		sum-=a[ans+1];
          		if(sum<0)
          		break;
          		ans++;
              }
          	printf("%d",ans);
          	return 0;
          }
          
          • 0
            @ 2021-10-17 14:25:40

            P1024. 僵尸水族馆

            题意概述

            一大波僵尸袭来,每个僵尸每天都会吃一定的脑子。在脑子数量固定的情况下、收养天数固定下,尽可能多的收养僵尸。

            题意分析

            必定是,吃得少的优先收养啊。怎么算一个僵尸将要吃多少脑子呢?当然是,收养那天开始到结束之间的天数乘以每天僵尸要吃的脑子数呀。 得到这个数据后,再对食量进行升序排序,然后再依次加入僵尸保证食量不超过所拥有的脑子数。 细节:先判断加入是否会超过总数再考虑加不加

            可行代码

            #include <algorithm>
            #include <iostream>
            using namespace std;
            int main() {
                int days, js;
                cin >> days >> js;
                int brain[days];
                for (int i = 0; i < days; i++) {
                    cin >> brain[i];
                    brain[i] *= days - i;
                }
                sort(brain, brain + days);
                int sum = 0, ans = 0;
                for (int i = 0; sum <= js && i < days; i++) {
                    if (sum + brain[i] <= js)
                        sum += brain[i], ans++;
                }
                cout << ans << endl;
                return 0;
            }
            
            • 0
              @ 2021-10-15 14:26:41

              思路 by zoey

              我觉得挺简单的这题,主要就是考排序。 首先把每一个僵尸假如收养后需要吃的总脑子数算出来,即a*(n-僵尸来的日子),存入数组sum,再将数组进行从小到大的排序,冒泡排序是比较简单的排序方式但时间复杂度高,但我这道题数据给的小所以可以过。然后再将sum数组里的数据从小到大相加,加起来的和大于学姐喂的总脑子数break即可,然后边加边统计一共加了多少次,总次数就是最终答案。

              code

              #include<bits/stdc++.h>
              using namespace std;
              
              const int N = 1e3+10;
              int a[N];
              int n,x;
              int main()
              {
              	scanf("%d%d",&n,&x);
              	for(int i = 0;i < n; ++i) {
              		scanf("%d",&a[i]);
              		a[i] *= (n-i);
              	}
              	sort(a,a+n);//可以用冒泡排序代替
              	int ans = 0;
              	for(int i = 0;i < n; ++i) {
              		if(x - a[i] < 0) break;
              		ans++;
              		x -= a[i];
              	}
              	printf("%d\n",ans);
              	
              	
              	return 0;
              }
              
              
              • 1

              Information

              ID
              25
              Time
              1000ms
              Memory
              256MiB
              Difficulty
              7
              Tags
              # Submissions
              264
              Accepted
              60
              Uploaded By