题解

246 条题解

  • 3
    @ 2018-05-15 23:51:04

    不知道这个题为什么难度6……
    可能有两个坑:
    1.苹果只能摘高度小于它的陶陶,高度和它相等的不能摘。
    2.高度为0的陶陶不能摘。
    但其实讲道理认真读题的话这两点都可以规避……
    方法就是纯模拟,没什么好说的……直接上代码,应该说比较简洁……

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,ans;
    int a[2005],t[2005];
    bool bj[2005];
    int main()
    {
        cin>>n>>m;
        ans=m;
        for(int i=1;i<=n;++i)
            cin>>a[i];
        for(int i=1;i<=m;++i)
            cin>>t[i];
        sort(t+1,t+m+1);
        for(int i=1;i<=n;++i)
            for(int j=m;j>=1;--j)
                if((a[i]>t[j])&&(bj[j]==0)&&(t[j]!=0))
                {
                    bj[j]=1;
                    ans--;
                    break;
                }
        cout<<ans;
        return 0;
    }
    
    • @ 2020-11-12 18:07:42

      因为这题目太容易坑,由于过于简单,想复杂了,我提交了7次才过

  • 3
    @ 2018-02-05 22:38:44

    水。。。。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    const int maxn=2005;
    int a[maxn];
    int b[maxn];
    bool al[maxn];
    int low=-1;
    int ans;
    int k;
    int main(){
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=m;i++)cin>>b[i];
        
        for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
                if(b[j]!=0 && a[i]>b[j] && low<b[j] && al[j]==false){
                    low=b[j];
                    k=j;
                }   
            }
            if(low!=-1)ans++;
            al[k]=true;
            low=-1;
            
        }
        
        cout<<m-ans;
        
        return 0;
    }
    
  • 3
    @ 2018-01-09 12:20:01

    var
    a,b:array[1..2000]of integer;
    s,n,m,i,j,t:longint;
    begin
    read(n,m);
    s:=m;
    for i:=1 to n do
    readln(a[i]);
    for i:=1 to m do
    readln(b[i]);
    for i:=1 to n-1 do
    for j:=i+1 to n do
    if b[i]<b[j]then begin
    t:=b[i];
    b[i]:=b[j];
    b[j]:=t;
    end;
    for i:=1 to n do
    for j:=1 to m do
    if (a[i]>b[j])and(b[j]<>0) then
    begin
    s:=s-1;
    b[j]:=0;
    break;
    end;
    writeln(s);
    end.

  • 2
    @ 2018-11-06 09:37:16

    既然n和m都是2000,而最大高度是300,那么为什么要让复杂度变成2000乘2000呢,反手就是一份300乘2000的。

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int a[2010];
    int b[300];
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=m;i++){
            int x;
            scanf("%d",&x);
            b[x]++;
        }
        sort(a+1,a+n+1);
        for(int i=1;i<=n;i++){
            for(int j=a[i]-1;j>=1;j--){
                if(b[j]){
                    b[j]--;
                    m--;
                    break;
                }       
            }
        }
        printf("%d",m);
        return 0;
    }
        
    
  • 2
    @ 2017-07-06 13:23:05

    纯粹模拟。题目最后要考虑到不能摘的,位置为0的陶陶。
    读程序注释:harvester(收割者)是苹果,fruit(果实)是可怜的陶陶。
    就是这样。恩恩。程序没有任何技术含量。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
        int fruit_height[301];
        memset(fruit_height,0,sizeof(fruit_height));
        int harvester, fruit;
        cin>>harvester>>fruit;
        int i,j;
        int harvester_height[harvester];
        for(i=0;i<harvester;i++)
        {
            cin>>j;
            harvester_height[i]=j;
        }
        for(i=0;i<fruit;i++)
        {
            cin>>j;
            fruit_height[j]+=1;
        }
        for(i=0;i<harvester;i++)
        {
            for(j=harvester_height[i]-1;j>0;j--)
            {
                if(fruit_height[j]>0)
                {
                    fruit_height[j]--;
                    fruit--;
                    goto end;
                }
            }
            end:
            continue;
        }
        cout<<fruit<<endl;
    }
    
  • 1
    @ 2020-10-14 14:35:29
    #include <cmath>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    namespace dts
    {
        int n,m,ans,a[2000],t[2000];
        
        int cmp(int x,int y)
        {
            return x<y;
        }
        
        void main()
        {
            scanf("%d%d",&n,&m);
            for (int i=0;i<n;i++)
                scanf("%d",&a[i]);
            for (int i=0;i<m;i++)
                scanf("%d",&t[i]);
            sort(&a[0],&a[n],cmp);
            sort(&t[0],&t[m],cmp);
            ans=0;
            for (int i=0,j=0;i<n&&j<m;)
            {
                while (t[j]==0&&j<m)
                    j++;
                if (j==m)
                    break;
                while (a[i]<=t[j])
                    i++;
                if (i<n)
                    i++,j++,ans++;
            }
            printf("%d\n",m-ans);
        }
    }
    
    int main()
    {
        dts::main();
    }
    
  • 1
    @ 2020-03-19 15:03:53

    @不退 的😝

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,ans;
    int a[2005],t[2005];
    bool bj[2005];
    int main()
    {
        cin>>n>>m;
        ans=m;
        for(int i=1;i<=n;++i)
            cin>>a[i];
        for(int i=1;i<=m;++i)
            cin>>t[i];
        sort(t+1,t+m+1);
        for(int i=1;i<=n;++i)
            for(int j=m;j>=1;--j)
                if((a[i]>t[j])&&(bj[j]==0)&&(t[j]!=0))
                {
                    bj[j]=1;
                    ans--;
                    break;
                }
        cout<<ans;
        return 0;
    }
    

    补充一下:测试点全a

  • 1
    @ 2020-03-17 21:23:52
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int apple[2005];
    int taotao[2005];
    int visited[2005];
    
    int main() {
        int n, m;
        cin >> n >> m;
        int cnt = m;
        
        for(int i = 0 ; i < n ; ++i) {
            cin >> apple[i];
        } 
        
        for(int i = 0 ; i < m ; ++i) {
            cin >> taotao[i];
        }
        
        sort(taotao, taotao + m);  //将淘淘排序 
        
        for(int i = 0 ; i < n ; ++i) {
            for(int j = m - 1 ; j >= 0 ; --j) {
                if(!visited[j] && apple[i] > taotao[j] && taotao[j] != 0) {  //如果没有被摘,且能摘到,且不为0 
                    visited[j] = 1;
                    cnt--;
                    break;
                }
            } 
        } 
    
        cout << cnt << endl;    
        return 0; 
    } 
    
  • 1
    @ 2019-10-27 11:28:06

    和你们的很像,但真是我自己写的:
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,m,ans,apple[100000],t[100000];
    bool f[10000];
    int main()
    {
    cin>>n>>m;
    ans=m;
    for(int i=1;i<=n;i++)cin>>apple[i];
    for(int i=1;i<=m;i++)cin>>t[i];
    sort(t+2,t+m+1);
    for(int i=1;i<=n;i++)
    {
    for(int j=m;j>=1;j--)
    {
    if(apple[i]>t[j] && t[j]!=0 && f[j]==false)
    {
    f[j]=true;
    ans--;
    break;
    }
    }
    }
    cout<<ans<<endl;
    return 0;
    }

  • 1
    @ 2019-07-24 20:38:31

    来一个简洁的
    #include <iostream>
    using namespace std;
    int main()
    {
    int n,m,tt[2000],pg[2000],i,j,e,a;
    cin>>n>>m;
    a=m;
    for(i=0;i<2000;i++) tt[i]=0;
    for(i=0;i<n;i++) cin>>pg[i];
    for(i=0;i<m;i++) cin>>tt[i];
    for(i=0;i<m-1;i++) for(j=i+1;j<m;j++) if(tt[i]<tt[j])
    {e=tt[i];tt[i]=tt[j];tt[j]=e;}
    for(i=0;i<n;i++)
    for(j=0;j<m;j++)
    if(pg[i]>tt[j]&&tt[j]!=0) {a--;tt[j]=0;break;}
    cout<<a;
    return 0;
    }

  • 1
    @ 2009-10-18 14:25:41

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    因为高度最大为300 开一个数组 a[i]表示高度为i的苹果有a[i]个

    对每个苹果 从j=(能摘到的最大高度-1)开始向下找到a[j]>0 然后dec(j) dec(m)

    最后输出m即可

    ps:烂陶陶不用管 读入时加个 >0 的判断就行 如果有烂的也都算在m里了所以只要把能摘下来的都dec掉剩的m就是答案

    源程序:

    var

    n,m,i,j,x:longint;

    a:array[1..300]of longint;

    b:array[1..2000]of longint;

    begin

    readln(n,m);

    for i:=1 to n do readln(b[i]);

    for i:=1 to m do

    begin

    readln(x);

    if x>0 then inc(a[x]);

    end;

    for i:=1 to n do

    for j:=b[i]-1 downto 1 do

    if a[j]>0 then begin

    dec(a[j]);

    dec(m);

    break;

    end;

    writeln(m);

    end.

  • 0
    @ 2020-06-22 22:15:42

    用了一下优先队列 AC
    ```cpp
    #include<queue>
    #include<iostream>
    using namespace std;

    int main(void) {
    priority_queue<int, vector<int>, less<int> > apple, tt;
    int apNum, tNum;
    scanf("%d %d", &apNum, &tNum);
    getchar();
    int t;
    for (int i = 0; i < apNum; i++) {
    scanf("%d", &t);
    getchar();
    apple.push(t);
    }
    for (int i = 0; i < tNum; i++) {
    scanf("%d", &t);
    getchar();
    tt.push(t);
    }
    int left = tNum;
    int a = 0;
    while (! tt.empty()) {
    t = tt.top();
    tt.pop();
    if (t == 0) {
    left--;
    break;
    }
    a = apple.top();
    if (a > t) {
    apple.pop();
    left--;
    }
    }
    printf("%d\n", left+1);
    }
    ```

  • 0
    @ 2019-06-25 19:38:38
    #include <iostream>
    #include <algorithm>
    #define maxn 2016
    using namespace std;
    
    int main()
    {
        int a[maxn],b[maxn],n,m;
        while(cin>>n>>m){
            int sum=m;
            for(int i=0;i<n;i++){
                cin>>a[i];
            }
            for(int i=0;i<m;i++){
                cin>>b[i];
            }
            sort(a,a+n);
            sort(b,b+m);
    
            for(int i=n-1;i>=0;i--){
                for(int j=m-1;j>=0;j--){
                    if(a[i]>b[j]&&b[j]!=0){
                        b[j]=0;
                        sum--;
                        j=0;
                    }
                }
            }
            cout<<sum<<endl;
        }
        return 0;
    }
    
    
  • 0
    @ 2018-11-30 19:30:27

    #include<stdio.h>
    int main(void)
    {
    int i,j,temp,a,t,apple[2000],tao[2000],count=0;
    scanf("%d%d",&a,&t);
    for(i=0;i<a;i++) scanf("%d",&apple[i]);
    for(i=0;i<t;i++) scanf("%d",&tao[i]);
    for(i=0;i<t-1;i++)
    for(j=i+1;j<t;j++) if(tao[i]<tao[j]) {
    temp=tao[i];
    tao[i]=tao[j];
    tao[j]=temp;
    }
    for(i=0;i<a;i++)
    for(j=0;j<t;j++){
    if(tao[j]>0) if(apple[i]>tao[j]) {tao[j]=-1;break;}
    }
    for(i=0;i<t;i++) if(tao[i]>=0) count++;
    printf("%d\n",count);
    return 0;
    }
    要注意三点:
    1、要先对陶陶从高到矮排序。
    2、苹果只能摘比自己矮的陶陶,和自己一样高的不能摘。
    3、身高为0的陶陶不能摘。

  • 0
    @ 2018-10-15 16:49:48

    #include<iostream>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    int apple[2001] = { 0 };
    int taotao[2001] = { 0 };
    int book[1001] = { 0 };
    int main()
    {
    int n, m,i,j,account=0;
    cin >> n >> m;
    for (i = 0; i < n; i++)
    cin >> apple[i];
    for (j = 0; j < m; j++)
    cin >> taotao[j];
    //这个时候i=n-1 j=m-1
    sort(apple, apple + n);
    sort(taotao, taotao + m);
    for (i=n-1; i >= 0; i--)
    {
    for (; j >= 0; j--)
    {
    if (apple[i] > taotao[j] && taotao[j] != 0)
    {
    j=j-1;
    account++;
    break;
    }
    }
    }
    cout << m - account;
    return 0;
    }

  • 0
    @ 2018-09-14 12:17:55

    //
    // main.cpp
    // algorithm
    //
    // Created by apple on 2018/9/7.
    // Copyright © 2018 apple. All rights reserved.
    //

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <map>
    #include <vector>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <cmath>
    #include <iomanip>
    #include <set>
    #include <cstring>

    using namespace std;

    int n, m;
    vector<int> ha, ht;

    int main(){
    cin.sync_with_stdio(false);
    cin >> n >> m;
    int iv;
    for(int i = 0; i < n; i++){cin >> iv; ha.push_back(iv);}
    for(int i = 0; i < m; i++){cin >> iv; if(iv != 0) ht.push_back(iv);}
    if(ht.size() == 0) {
    cout << m << endl;
    return 0;
    }
    sort(ht.begin(), ht.end());
    int ans = m;
    for(int i = 0; i < n; i++){
    int pos = lower_bound(ht.begin(), ht.end(), ha[i]) - ht.begin();
    if(pos > 0){
    ans--;
    ht.erase(ht.begin() + pos - 1);
    }
    }
    cout << ans << endl;
    return 0;
    }

    //之前几次lower_bound都用错了, WA了好几次, 返回的是大于等于要找值的第一个数.

  • 0
    @ 2018-09-14 12:17:54

    //
    // main.cpp
    // algorithm
    //
    // Created by apple on 2018/9/7.
    // Copyright © 2018 apple. All rights reserved.
    //

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <map>
    #include <vector>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <cmath>
    #include <iomanip>
    #include <set>
    #include <cstring>

    using namespace std;

    int n, m;
    vector<int> ha, ht;

    int main(){
    cin.sync_with_stdio(false);
    cin >> n >> m;
    int iv;
    for(int i = 0; i < n; i++){cin >> iv; ha.push_back(iv);}
    for(int i = 0; i < m; i++){cin >> iv; if(iv != 0) ht.push_back(iv);}
    if(ht.size() == 0) {
    cout << m << endl;
    return 0;
    }
    sort(ht.begin(), ht.end());
    int ans = m;
    for(int i = 0; i < n; i++){
    int pos = lower_bound(ht.begin(), ht.end(), ha[i]) - ht.begin();
    if(pos > 0){
    ans--;
    ht.erase(ht.begin() + pos - 1);
    }
    }
    cout << ans << endl;
    return 0;
    }

    //之前几次lower_bound都用错了, WA了好几次, 返回的是大于等于要找值的第一个数.

  • 0
    @ 2018-09-08 23:51:28

    #include<iostream>
    #include<algorithm>
    using namespace std;
    bool compare(int a, int b) {
    return a > b;
    }
    int main() {
    int a[2000];
    int b[2000];
    int n, m;
    int sum = 0;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    }
    for (int i = 0; i < m; i++)
    scanf("%d", &b[i]);
    sort(b, b + m, compare);
    sort(a, a + n, compare);
    for (int i = 0; i < n; i++) {
    for(int j=0;j<m;j++)
    if (a[i] > b[j] && b[j] > 0) {
    sum++;
    b[j] = 0;
    break;
    }
    }
    cout << m - sum << endl;
    return 0;
    }

  • 0
    @ 2018-08-06 17:59:34
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
        int apple[2000]={0},tao[2000]={0};
        int anum,tnum,i,j,temp,sum = 0;
        scanf("%d%d",&anum,&tnum);
        for(i = 0; i < anum; i++)
            scanf("%d",apple+i);
        for(i = 0; i < tnum; i++)
            scanf("%d",tao+i);
        for(i = 0; i < anum; i++)
        {
            temp = 0;
            while((tao[temp] >= apple[i] || tao[temp] == 0) && temp != tnum)
                temp++;
            if(temp == tnum)
                continue;
            for(j = temp + 1; j < tnum; j++)
            {
                if(tao[j] < apple[i] && tao[j] != 0 && tao[temp] < tao[j])
                    temp = j;
            }
            sum++;
            tao[temp] = 0;
        }
        printf("%d\n",tnum - sum);
        return 0;
    }
    
    
  • 0
    @ 2018-07-15 09:36:01

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,ans;
    int a[2005],t[2005];
    bool bj[2005];
    int main()
    {
    cin>>n>>m;
    ans=m;
    for(int i=1;i<=n;++i)
    cin>>a[i];
    for(int i=1;i<=m;++i)
    cin>>t[i];
    sort(t+1,t+m+1);
    for(int i=1;i<=n;++i)
    for(int j=m;j>=1;--j)
    if((a[i]>t[j])&&(bj[j]==0)&&(t[j]!=0))
    {
    bj[j]=1;
    ans--;
    break;
    }
    cout<<ans;
    return 0;
    }

信息

ID
1291
难度
6
分类
贪心 点击显示
标签
(无)
递交数
9227
已通过
2225
通过率
24%
被复制
5
上传者