目录
L2-1 插松枝
卡输出格式确实折磨>_<
也可以边处理边输出,就不用储存结果(酱紫大概会简单很多?)。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int n,m,k;
int b[N],num;
int tre[N][N],t[N],tot=1;;
void gfb(){
if(!num || b[num]>tre[tot][t[tot]]) return ;
tre[tot][++t[tot]]=b[num--];
if(t[tot]==k) tot++;
gfb();
return ;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++) tre[i][0]=0x3f3f3f;
for(int i=1;i<=n;i++){
int a; scanf("%d",&a);
gfb();
if(a<=tre[tot][t[tot]]) tre[tot][++t[tot]]=a;
else {
if(num==m){
tot++;
gfb();
}
if(a<=tre[tot][t[tot]]) tre[tot][++t[tot]]=a;
else b[++num]=a;
}
if(t[tot]==k) tot++;
//printf("当前推进器中第%d片叶子,用到第%d棵树,该树上有叶子%d片,盒子中有叶子%d片\n",i,tot,t[tot],num);
}
while(1){
if(!num) break;
tot++; gfb();
}
for(int i=1;i<=tot;i++){
for(int j=0;j<t[i];j++){
if(j)printf(" ");
printf("%d",tre[i][j+1]);
}
if(i==tot) break;
printf("\n");
}
return 0;
}
L2-2 老板的作息表
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;
struct node{
int h1,m1,s1;
int h2,m2,s2;
}tim[N];
bool cmp(node a,node b){
if(a.h1! = b.h1) return a.h1<b.h1;
else if(a.m1 != b.m1) return a.m1<b.m1;
else return a.s1<b.s1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d:%d:%d - %d:%d:%d",&tim[i].h1,&tim[i].m1,&tim[i].s1,&tim[i].h2,&tim[i].m2,&tim[i].s2);
}
sort(tim+1,tim+n+1,cmp);
/*for(int i=1;i<=n;i++){
printf("%02d:%02d:%02d-%02d:%02id:%02d\n",tim[i].h1,tim[i].m1,tim[i].s1,tim[i].h2,tim[i].m2,tim[i].s2);
}*/
if(tim[1].h1!=0 || tim[1].m1!=0 || tim[1].s1!=0)
printf("00:00:00 - %02d:%02d:%02d\n",tim[1].h1,tim[1].m1,tim[1].s1);
for(int i=1;i<n;i++){
if(tim[i].h2!=tim[i+1].h1 || tim[i].m2!=tim[i+1].m1 || tim[i].s2!=tim[i+1].s1)
printf("%02d:%02d:%02d - %02d:%02d:%02d\n",tim[i].h2,tim[i].m2,tim[i].s2,tim[i+1].h1,tim[i+1].m1,tim[i+1].s1);
}
if(tim[n].h2!=23 || tim[n].m2!=59 || tim[n].s2!=59)
printf("%02d:%02d:%02d - 23:59:59\n",tim[n].h2,tim[n].m2,tim[n].s2);
return 0;
}
L2-3 龙龙送外卖
找到并减去最深的那条路就好了
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,f[N],c[N],sta,dst,ans;
bool vis[N];
//存图染色
int tot,head[N];
struct node{
int nxt,v;
}e[N];
void add(int u,int v){
e[++tot].v=v;
e[tot].nxt=head[u];
head[u]=tot;
}
void color(int x,int t){
c[x]=t;
int idx=head[x];
while(idx!=-1){
color(e[idx].v,t+1);
idx=e[idx].nxt;
}
return ;
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&f[i]);
if(f[i]==-1) sta=i;
else add(f[i],i);
}
color(sta,1);
for(int i=1;i<=m;i++){
int x; scanf("%d",&x);
dst=max(dst,c[x]);
while(!vis[x] && f[x]!=-1){
vis[x]=1;
ans+=2;
x=f[x];
}
printf("%d\n",ans-dst+1);
}
return 0;
}
L2-4 大众情人
scanf输入真灵活……
#include<bits/stdc++.h>
using namespace std;
const int N=5e2+5;
const int INF=0x3f3f3f;
int n,dis[N][N];
char sex[N];
int res[N],ans_F=INF,ans_M=INF;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=INF;
for(int i=1;i<=n;i++){
dis[i][i]=0;
int num;
scanf(" %c %d",&sex[i],&num);
/*
scanf()作单字符输入时规定只接收一个字符。
但它却把回车符也作为字符对待的。
这个回车符是放在缓冲区的,这就造成程序中第二次调用scanf("%c",&c)是从缓冲区中取一个字符,
把第一次调用scanf("%c",&c)后输入的回车当作输入字符了。
这就在输入逻辑上造成了混乱。
有了scanf(" %c",&c)这个空格,这样就把缓冲区中的回车当成第一个字符,读取后丢掉。
*/
while(num--){
int j,val;
scanf("%d:%d",&j,&val);
dis[i][j]=val;
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(sex[i]!=sex[j]){
res[i]=max(res[i],dis[j][i]);
}
}
if(sex[i]=='F') ans_F=min(ans_F,res[i]);
else ans_M=min(ans_M,res[i]);
}
for(int i=1;i<=n;i++)
if(sex[i]=='F' && res[i]==ans_F)
printf("%d ",i);
printf("\n");
for(int i=1;i<=n;i++)
if(sex[i]=='M' && res[i]==ans_M)
printf("%d ",i);
return 0;
}