CSDN 编程竞赛十五期题解

1、求并集

由小到大输出两个单向有序链表的并集 如链表 A {1 -> 2 -> 5 -> 7} 链表 B {3 -> 5 -> 7 -> 8} 输出: {1 -> 2 ->3 - > 5 -> 7 ->8} 。

#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
scanf("%d%d",&n,&m);
vector<int>v(n+m);
for(int &i:v)scanf("%d",&i);
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
printf("%d",v.front());
for(int i=1;i<v.size();++i)printf(" -> %d",v[i]);
return 0;
}

2、小T找糖豆

已知连续序列A,包含1e18个元素,分别是[1,1e8]。 现在去除序列中的n个元素. 得到新的连续序列[X,1e8],该序列中 最小元素是?

#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
vector<int>v(n);
for(int &i:v)scanf("%d",&i);
printf("%d",*max_element(v.begin(),v.end())+1);
return 0;
}

3、争风吃醋的豚鼠

N个节点两两建边。 不存在3个节点相互之前全部相连(3个节点连接成环) 。最多能建立多少条边?

#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
long long ans=0;
while(n>0)ans+=n-1,n-=2;
printf("%lld",ans);
}

4、选择客栈

丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。 两位游客一起去丽江旅 游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一 家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p 。 他们想 知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元的咖啡店小聚。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn],b[maxn],k,lg,lg2[maxn],n,p,r[61],st[19][maxn];
vector<int>pos[61];
inline void build_st(){
for(int i=1;i<=n;++i)lg2[i]=lg2[i-1]+((2<<lg2[i-1])==i),st[0][i]=b[i];
lg=lg2[n];
for(int i=1;i<=lg;++i)
for(int j=1;j+(1<<i)-1<=n;++j)
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
}
inline int query(int l,int r){
int k=lg2[r-l+1];
return min(st[k][l],st[k][r-(1<<k)+1]);
}
int main(){
scanf("%d%d%d",&n,&k,&p);
for(int i=1;i<=n;++i)scanf("%d%d",a+i,b+i),pos[a[i]].push_back(i);
build_st();
long long ans=0;
for(int i=1;i<=n;++i){
while(r[a[i]]<pos[a[i]].size()&&(pos[a[i]][r[a[i]]]<=i||query(i,pos[a[i]][r[a[i]]])>p))++r[a[i]];
ans+=pos[a[i]].size()-r[a[i]];
}
printf("%lld",ans);
return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aery_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值