CSDN编程周赛第18期题解
Posted 酷酷的Herio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSDN编程周赛第18期题解相关的知识,希望对你有一定的参考价值。
CSDN编程周赛第18期题解
1、题目名称:单链表排序
单链表的节点定义如下(C++): class Node public: int element; Node * next; 实现如下函数:Node * sort(Node * head),排序以 head 为头结点的单链表,返回排序后列表的 head 节点;只能修改 next 指针,要求时间 复杂度和空间复杂度尽可能优化。
#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 a[N];
int main()
int n;cin>>n;
rep(i,1,n) cin>>a[i];
sort(a+1,a+n+1);
rep(i,1,n) printf("%d ",a[i]);
return 0;
2、题目名称:合并二叉树
已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个 树的结点来代替。例如: 两颗二叉树是: Tree 1 1 / 3 2 / 5 Tree 2 2 / 1 3 4 7 合并后的树为 3 / 4 5 / 5 4 7
#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 n,m;
int a[N],b[N],c[N];
void dfs(int u,int v)
if(!a[u]&&!b[v]) return;
//if(!a[u]) return b[v];
//if(!b[v]) return a[u];
if(a[u]==-1&&b[v]==-1) a[u] = -1;
else if(a[u]==-1 && v>m) a[u]=-1;
else if(b[v]==-1 && u>n) a[u]=-1;
else
a[u]=max(a[u],0);
b[v]=max(b[v],0);
a[u]+=b[v];
dfs(u<<1,v<<1);
dfs(u*2+1,v*2+1);
int main()
cin>>n>>m;
rep(i,1,n)
string s;
cin>>s;
if(s=="null") a[i]=-1;
else a[i]=stoi(s);
rep(i,1,m)
string s;
cin>>s;
if(s=="null") b[i]=-1;
else b[i]=stoi(s);
dfs(1,1);
for(int i=1;i<=max(n,m);i++)
if(a[i]==-1) printf("null ");
else printf("%d ",a[i]);
return 0;
3、题目名称:n边形划分
已知存在n多边形, 连接多边形所有对角线。 能形成多少区域。
#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;
ll ksm(ll a,ll n,ll m=mod)
ll ans=1;
while(n)
if(n&1) ans=ans*a%m;
a=a*a%m;
n>>=1;
return ans;
ll C(ll n,ll m)
ll s= 1;
for(ll i=n;i>n-m;i--)
s=s*i%mod;
ll d =1;
for(ll i =1;i<=m;i++) d=d*i%mod;
return s*ksm(d,mod-2)%mod;
int main()
ll n;cin>>n;
ll x = (C(n,2)+C(n,4)-n+1)%mod;
x=(x%mod+mod)%mod;
cout<<x;
retu
4、题目名称:开心的金明
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天 对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N 元钱就行”。 今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的 N 元。 于是,他把每件物品规定了一个重要度,分为 5 等:用整数 1-5 表示,第 5 等最重要。他还从因特网上查到了每件物品 的价格(都是整数元)。他希望在不超过 N 元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最 大。 设第 j 件物品的价格为 ##v_[j] ##,重要度为 ##w_[j] ##,共选中了 k 件物品,编号依次为 ##j_1,j_2, …,j_k## ,则所求的总和为: ##v_[j_1] imes w_[j_1]+v_[j_2] imes w_[j_2]+ …+v_[j_k] imes w_[j_k] ##。 请你帮助金明设计一个满足要求的购物单
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=3e4+5;
int dp[N],n,m,w[30],p[30];
int main()
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
scanf("%d%d",&w[i],&p[i]);
for(int i=0;i<m;i++)
for(int j=n;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+w[i]*p[i]);
cout<<dp[n]<<endl;
return 0;
以上是关于CSDN编程周赛第18期题解的主要内容,如果未能解决你的问题,请参考以下文章