Acwing 贪心打卡

区间问题

905. 区间选点

https://www.acwing.com/problem/content/907/
思路:对右区间进行排序
然后每次要选就选择end 保证了答案的最小

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int n;
int ans;
struct S
{
    int begin;
    int end;
}s[N];
bool cmp(S a,S b){
    return a.end<b.end;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a>>b;
        s[i]={a,b};
    }
    sort(s,s+n,cmp);
    int temp=s[0].end;
    ans++;
    for(int i=1;i<n;i++){
        if(s[i].begin>temp){
            ans++;
            temp=s[i].end;
        }
    }
    cout<<ans<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

908. 最大不相交区间数量

https://www.acwing.com/problem/content/910/
和上题完全一样。。。。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int n;
int ans;
struct S
{
    int begin;
    int end;
}s[N];
bool cmp(S a,S b){
    return a.end<b.end;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a>>b;
        s[i]={a,b};
    }
    sort(s,s+n,cmp);
    int temp=s[0].end;
    ans++;
    for(int i=1;i<n;i++){
        if(s[i].begin>temp){
            ans++;
            temp=s[i].end;
        }
    }
    cout<<ans<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

906. 区间分组

https://www.acwing.com/problem/content/908/

由于每次要找到所有开的区间的最小end,所以使用小根堆

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int n;
int ans;
struct S
{
    int begin;
    int end;
}s[N];
bool cmp(S a,S b){
    return a.begin<b.begin;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a>>b;
        s[i]={a,b};
    }
    sort(s,s+n,cmp);
    priority_queue<int,vector<int>,greater<int>>q;//小根堆
    q.push(s[0].end);
    for(int i=1;i<n;i++){
        if(s[i].begin<=q.top()){
            q.push(s[i].end);
        }
        else {
            q.pop();//该区间可以插入已有的区间 同时更新区间的值
            q.push(s[i].end);
        }
    }
    cout<<q.size()<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

907. 区间覆盖

https://www.acwing.com/problem/content/909/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int n;
int ans;
struct S
{
    int begin;
    int end;
}s[N];
int L,R;
bool cmp(S a,S b){
    return a.begin<b.begin;
}
int main(){
    cin>>L>>R;
    cin>>n;
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a>>b;
        s[i]={a,b};
    }
    sort(s,s+n,cmp);
    int res=0;
    bool flag=false;
    for(int i=0;i<n;i++){
        int j=i,temp=-0x3f3f3f3f;
        while(s[j].begin<=L && j<n){
            temp=max(temp,s[j].end);
            j++;
        }
        if(temp<L){//没有点能到L
            res=-1;
            break;
        }
        res++;
        if(temp>=R){//找到了答案
            flag=true;
            break;
        }
        L=temp;
        i=j-1;
    }
    if(!flag) puts("-1");
    else cout<<res<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

148. 合并果子

https://www.acwing.com/problem/content/150/
利用小根堆实现哈夫曼算法

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
priority_queue<LL,vector<LL>,greater<LL>>q;
int n;
LL ans=0;
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        q.push(x);
    }
    for(int i=0;i<n-1;i++){
        int x=q.top();
        q.pop();
        int y=q.top();
        q.pop();
        ans=ans+x+y;
        q.push(x+y);
    }
    cout<<ans<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

913. 排队打水

https://www.acwing.com/problem/content/description/915/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int n;
int a[N];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    LL ans=0;
    sort(a+1,a+1+n);
    for(int i=1;i<=n-1;i++){
        ans=ans+a[i]*(n-i);
    }
    cout<<ans<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

104. 货仓选址

https://www.acwing.com/problem/content/106/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<stdlib.h>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e6+10;
int a[N];
int n;
int maxv,minv=0x3f3f3f3f;
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    int temp=a[n/2];
    LL res=0;
    for(int i=0;i<n;i++){
        res+=abs(a[i]-temp);
    }
    cout<<res<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

125. 耍杂技的牛

https://www.acwing.com/problem/content/127/

#include <iostream>
#include <algorithm>

using namespace std;

typedef pair<int, int> PII;

const int N = 50010;

int n;
PII cow[N];

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int s, w;
        scanf("%d%d", &w, &s);
        cow[i] = {w + s, w};
    }

    sort(cow, cow + n);

    int res = -2e9, sum = 0;
    for (int i = 0; i < n; i ++ )
    {
        int s = cow[i].first - cow[i].second, w = cow[i].second;
        res = max(res, sum - s);
        sum += w;
    }

    printf("%d\n", res);

    return 0;
}

1055. 股票买卖 II

https://www.acwing.com/problem/content/1057/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1e5+10;
int a[N];
int n;
int ans;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n-1;i++){
        if(a[i+1]>a[i]){
            ans+=a[i+1]-a[i];
        }
    }
    cout<<ans<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);
posted @ 2021-05-21 15:11  一个经常掉线的人  阅读(47)  评论(0)    收藏  举报