团体程序设计天梯赛-练习集
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了团体程序设计天梯赛-练习集相关的知识,希望对你有一定的参考价值。
L2-001 紧急救援 (25 分)
知识点:最短路dij
#include<bits/stdc++.h>
#define debug(x,y) printf("%s = %d\\n",x,y);
typedef long long ll;
using namespace std;
inline int read()
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')if(ch=='-')w=-1;ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
const int INF=0x3f3f3f;
const int maxn=1000;
int a[maxn];
int edge[maxn][maxn];
int n,m,s,d;
int dis[maxn];
int vis[maxn];
int cnt[maxn];
int num_a[maxn];//最短路上的最大救援队
int pathnum[maxn];//最短路的数量
int path[maxn];
void dij()
pathnum[s]=1;
dis[s]=0;
vis[s]=1;
num_a[s]=a[s];
for(int i=0;i<n;i++)
dis[i]=edge[s][i];
if(edge[s][i]<=INF&&i!=s)
path[i]=s;
num_a[i]=num_a[s]+a[i];
pathnum[i]=1;
for(int i=1;i<n;i++)
int now=0;
int minn=INF;
for(int j=0;j<n;j++)
if(vis[j]==0&&dis[j]<minn)
now=j;
minn=dis[j];
vis[now]=1;
for(int j=0;j<n;j++)
if(!vis[j])
if(dis[j]==edge[now][j]+minn)
pathnum[j]+=pathnum[now];
if(num_a[j]<num_a[now]+a[j])
num_a[j]=num_a[now]+a[j];
path[j]=now;
else if(dis[j]>edge[now][j]+minn)
dis[j]=edge[now][j]+minn;
num_a[j]=num_a[now]+a[j];
pathnum[j]=pathnum[now];
path[j]=now;
void print(int now)
if(now==s)
return ;
print(path[now]);
cout<<" "<<now;
int main()
// memset(edge,0x3f3f3f,sizeof(edge));
cin>>n>>m>>s>>d;
for(int i=0;i<n;i++)
dis[i]=INF;
for(int j=0;j<n;j++)
edge[i][j]=edge[j][i]=INF;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=1;i<=m;i++)
int u,v,w;
cin>>u>>v>>w;
edge[u][v]=w;
edge[v][u]=w;
dij();
cout<<pathnum[d]<<" "<<num_a[d]<<endl;
cout<<s;
print(d);
L2-002 链表去重 (25 分)
知识点:模拟链表
#include<bits/stdc++.h>
#define debug(x,y) printf("%s = %d\\n",x,y);
typedef long long ll;
using namespace std;
inline int read()
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')if(ch=='-')w=-1;ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
const int maxn=2e5+9;
struct node
int add;
int val,next;
link[maxn],b[maxn];
int vis[maxn];
int tot=0;
int main()
int beg,n;
cin>>beg>>n;
for(int i=1;i<=n;i++)
int add,val,nex;
cin>>add>>val>>nex;
link[add].val=val;
link[add].next=nex;
int now=beg;
// printf("----\\n");
while(1)
// printf("now=%d\\n",now);
if(now==-1)
break;
if(vis[abs(link[now].val)]==0)
if(now!=beg)
printf("%05d\\n",now);
vis[abs(link[now].val)]=1;
printf("%05d %d ",now,link[now].val);
// cout<<now<<" "<<link[now].val<<" "<<link[now].next<<endl;
now=link[now].next;
else
b[++tot].next=link[now].next;
b[tot].add=now;
b[tot].val=link[now].val;
now=link[now].next;
printf("-1\\n");
if(tot)
printf("%05d %d ",b[1].add,b[1].val);
for(int i=2;i<=tot;i++)
printf("%05d\\n%05d %d ",b[i].add,b[i].add,b[i].val);
printf("-1\\n");
L2-003 月饼 (25 分)
知识点:贪心
注意要将种类数和需求数都开成double,不然会被卡一个点
#include<bits/stdc++.h>
#define debug(x,y) printf("%s = %d\\n",x,y);
typedef long long ll;
using namespace std;
inline int read()
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')if(ch=='-')w=-1;ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
const int maxn=2000;
//int num[maxn];
//int val[maxn];
struct node
double num,val;
double ave;
a[maxn];
bool cmp(node a,node b)
return a.val*b.num>b.val*a.num;
int main()
int n,d;
cin>>n>>d;
for(int i=1;i<=n;i++)cin>>a[i].num;
for(int i=1;i<=n;i++)cin>>a[i].val;
for(int i=1;i<=n;i++)a[i].ave=1.0*a[i].val/a[i].num;
sort(a+1,a+1+n,cmp);
double sum=0;
for(int i=1;i<=n;i++)
// cout<<a[i].ave<<endl;
if(d>=a[i].num)
d-=a[i].num;
sum+=a[i].val;
else
sum+=d*a[i].ave;
break;
printf("%.2f\\n",sum);
L2-004 这是二叉搜索树吗? (25 分)
知识点:考察了前序遍历和后序遍历的应用
#include<bits/stdc++.h>
#define debug(x,y) printf("%s = %d\\n",x,y);
typedef long long ll;
using namespace std;
inline int read()
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')if(ch=='-')w=-1;ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
const int maxn=2000;
int pos[maxn];
int iff=0;
vector<int>post;
void getpos(int l,int r)
if(l>r)return ;
int tl=l+1,tr=r;
if(!iff)//正常的二叉搜索树
while(tl<=r&&pos[tl]<pos[l])tl++;//找到第一个大的
while(tr>l&&pos[tr]>=pos[l])tr--; //找到第一个小的
else //镜像的
while(tl<=r&&pos[tl]>=pos[l])tl++;
while(tr>l&&pos[tr]<pos[l])tr--;
if(tl!=tr+1)return ;
getpos(l+1,tr);
getpos(tl,r);
// cout<<pos[l]<<endl;
post.push_back(pos[l]);
int main()
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>pos[i];
getpos(1,n);
if(post.size()!=n)
iff=1;
post.clear();
getpos(1,n);
if(post.size()!=n)
cout<<"NO"<<endl;
return 0;
cout<<"YES"<<endl;
for(int i=0;i<n;i++)
if(i==0)
printf("%d",post[i]);
else printf(" %d",post[i]);
return 0;
L2-005 集合相似度 (25 分)
知识点:考察对set的应用情况
#include<bits/stdc++.h>
#define debug(x,y) printf("%s = %d\\n",x,y);
typedef long long ll;
using namespace std;
inline int read()
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')if(ch=='-')w=-1;ch=getchar()以上是关于团体程序设计天梯赛-练习集的主要内容,如果未能解决你的问题,请参考以下文章
PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集