为什么第四个点过不了?

P1478 陶陶摘苹果(升级版)

ジン・ムヤン @ 2018-12-12 18:19:16

#include<stdio.h>
struct pl{
           int p,l;
         };
int main()
{
    int n,s,a,b,i,j,count=0;
    struct pl m[100],t,c[100];
    scanf("%d%d",&n,&s);
    scanf("%d%d",&a,&b);
    for(i=0;i<n;i++){
                      scanf("%d%d",&m[i].p,&m[i].l);
                    }
    for (i=0;i<n-1;++i){
                        for(j=0;j<n-1-i;++j){
                                             if(m[j].l >m[j+1].l){  
                                                                  t=m[j];
                                                                  m[j]=m[j+1];
                                                                  m[j+1]=t; 
                                                                 }                   
                                            }                       
                       }
    i=0;
    while(s>=m[i].l){
                if(a+b>=m[i].p) {
                                 s=s-m[i].l;
                                 count++;
                                }
                i++;
               }
    printf("%d",count);
    return 0;    
}

by caidzh @ 2018-12-12 18:21:35

这左右横跳的码风。。。


by ジン・ムヤン @ 2018-12-12 19:41:07

@土田共戈 大佬,知道哪里错了吗?求解


by billy23333 @ 2018-12-14 19:15:00

巧了,我只过了第四个点


by 是你的七七 @ 2018-12-17 13:29:06

我也只过了第四个点,弱弱的问一句RE是什么意思


by pangchenyu @ 2018-12-17 20:39:38

include<bits/stdc++.h>

using namespace std; int main() { int n,s,a,b,xi,yi; int y[5005]={0}; cin>>n>>s>>a>>b; int c= 1; for(int i=1; i<=n; i++) { cin>>xi>>yi; if(a+b>=xi) { //可以拿到苹果 并且力气够 y[c++]=yi; } } sort(y+1,y+1+c-1);//sort库函数,排序 int t= 0; //总共消耗的力气数 int ans = 0; for (int i=1; i<c; i++) { if(t+y[i]<=s) { t+=y[i]; ans++; } else { break; } } printf("%d\n",ans); return 0; }


by apassbydreg @ 2018-12-20 12:26:49

根据我wa的经验来看……第四个点的数据是所有苹果都能摘完而且体力还非负的。

如果第四个点wa或者re的话可以考虑在检测的循环中加上类似 if(计数==n) break; 的代码。

如果是只有第四个点过了的话……请考虑你们排序的算法吧……因为第四个点上述的特殊性就算你不排序也能过的

贴一下我AC的代码(C语言):

#include<stdio.h>
#include<stdlib.h>

int cmp(const void *a, const void *b)
{
    return **(int**)a - **(int**)b;
} // qsort 对指针数组排序

int main()
{
    int i,a,b,l,n,s,height[5000],strength[5000];
    int *pointer[5000];
    scanf("%d %d %d %d", &n, &s, &a, &b);
    l = a + b;
    for(i=0;i<n;i++) 
    {
        scanf("%d %d", height+i, strength+i);
        pointer[i] = strength + i; // 这个指针数组指向要用的力气
    }

    qsort(pointer,n,sizeof(int*),cmp); // 从小到大排列所需力气    

    int num=0;
    for(i=0;s>=0 && i<n;i++)
    {
        if(height[pointer[i]-strength]<=l) // 检测是否能摘到
        {
            s = s - *pointer[i];
            if(s<0) break;
            num++;
        }
    }

    printf("%d", num);
}

|