CSDN 编程竞赛第15期题解

CSDN 编程竞赛第15期题解

1、求并集

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

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {
    
    402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
    
    
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
    
    
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
    
    
if(x>y) x=y;
}
int main() {
    
    
int n,m;
set<int>a;
cin>>n>>m;
int x;
for(int i=0;i<n+m;i++) cin>>x,a.insert(x);
vector<int>b;
for(int x:a) b.push_back(x);
printf("%d",b[0]);
for(int i=1;i<b.size();i++) printf(" -> %d",b[i]);
return 0;
}

2、小T找糖豆

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

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {
    
    402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
    
    
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
    
    
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
    
    
if(x>y) x=y;
}
int main() {
    
    
int n,x;
x=0;
cin>>n;
int v=0;
for(int i=1;i<=n;i++) cin>>x,v=max(v,x);
cout<<v+1;
return 0;
}

3、争风吃醋的豚鼠

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

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {
    
    402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
    
    
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
    
    
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
    
    
if(x>y) x=y;
}
int main() {
    
    
ll n;cin>>n;
if(n%2==0) cout<<(n/2)*(n/2);
else cout<<(n-1)/2*((n+1)/2);
return 0;
}

4、选择客栈

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

#include<cstdio>
int n,k,p,sum,pos;
int a[200001],b[200001],c[200001];
int main(){
    
    
scanf("%d%d%d",&n,&k,&p);
for(int i=1;i<=n;i++){
    
    
int col,q;
scanf("%d%d",&col,&q);
if(q<=p) pos=i;
if(pos>=a[col]) c[col]=b[col];
a[col]=i;
sum+=c[col];
b[col]++;
}
printf("%d\n",sum);
return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/128386332