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);

浙公网安备 33010602011771号