【天梯赛历年真题题解】L2

L2-001 紧急救援

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 502;
int num[N];
vector<pair<int,int>>G[N];
int vis[N];
int dis[N];
int path[N];
int Max[N];
int sum[N];
int main()
{ 
    int n,m,s,d;
    cin>>n>>m>>s>>d;
    for(int i=0;i<n;i++)
        cin>>num[i];

    for(int i=0;i<m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        G[u].push_back({v,w});
        G[v].push_back({u,w});        
    }
   
    priority_queue< pair<int,int> ,vector< pair<int,int> >, greater< pair<int,int> > >Q;
    Q.push({0,s});
    memset(dis,0x3f3f3f3f,sizeof(dis));
    dis[s]=0;
    sum[s]=1;
    Max[s]=num[s];
    while(!Q.empty())
    {
        
        int u = Q.top().second;
        Q.pop();
        
        if(vis[u])
            continue;
        vis[u]=1;
        
        for(auto [v,w] : G[u])
        {
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                Q.push({dis[v],v});
                sum[v]=sum[u];
                Max[v]=Max[u]+num[v];
                path[v]=u;
            } 
            else if(dis[v]==dis[u]+w)
            {
                sum[v]+=sum[u];
                if(Max[u]+num[v]>=Max[v])
                {
                    Max[v]=Max[u]+num[v];
                    path[v]=u;
                }
            }
        }
    }
    
    cout<<sum[d]<<" "<<Max[d];
 
    cout<<endl;
    int ss = d;
    stack<int>st;
    while(ss!=s)
    {
        st.push(ss);
        ss=path[ss];
    }
    cout<<s;
    while(!st.empty())
    {
        cout<<" "<<st.top();
        st.pop();
    }
   
    return 0;
}

L2-002 链表去重

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int next;
    int val;
    Node(int next,int w){
        this->next=next;
        this->val=w;
    }
    Node(){
        
    }
}node[100005],node2[100005],node3[100005];
int vis[100005];
int main()
{
    int head,n;
    cin>>head>>n;
    
    for(int i=0;i<n;i++)
    {
        int u,v,w;
        cin>>u>>w>>v;
        node[u]=Node(v,w);
    }
    memset(vis,0,sizeof(vis));
    int x=head;
    int cnt2=0;
    int cnt3=0;
    while(x!=-1)
    {
        int val=node[x].val;
        if(vis[abs(val)])//
        {
            node3[cnt3].next=x;
            node3[++cnt3]=Node(-1,val);
        }else
        {
            node2[cnt2].next=x;
            node2[++cnt2]=Node(-1,val);
            vis[abs(val)]=1;
        }
        x=node[x].next;
    }
    int per=node2[0].next;
    for(int i=1;i<=cnt2;i++)
    {
       
        printf("%05d %d ",per,node2[i].val);
        if(node2[i].next==-1)
            cout<<-1<<endl;
        else
        {
           printf("%05d\n",node2[i].next);
        }
        per=node2[i].next;
    }
     per=node3[0].next;
    for(int i=1;i<=cnt3;i++)
    {
         printf("%05d %d ",per,node3[i].val);
        if(node3[i].next==-1)
            cout<<-1<<endl;
        else
        {
           printf("%05d\n",node3[i].next);
        }
        per=node3[i].next;
    }
    return 0;
}

L2-003 月饼

// //k 
// #include<bits/stdc++.h>
// using namespace std;
// int main()
// {
//     int N,D;
//     cin>>N>>D;
//     int w[10005];
//     int v[10005];
//   //  double bz[100000];
//     pair<double,int> bz[100000];
    
//     for(int i=0;i<N;i++)
//     {
//         cin>>w[i];
//     }
//     for(int i=0;i<N;i++)
//     {
//         cin>>v[i];
//     }
//     for(int i=0;i<N;i++)
//     {
//         bz[i].first=(v[i]*1.0/w[i]);
//         bz[i].second=w[i];
//     }
//     sort(bz,bz+N,[](pair<double,int> n1,pair<double,int> n2){
    	
//     	return n1.first>n2.first;
// 	});
//     double res=0;
//     for(int i=0;i<N;i++)
//     {
//         if(D==0)
//             break;
//         if(bz[i].second<=D)
//         {
//             res+=(bz[i].first*bz[i].second);
//             D-=bz[i].second;
//         }
//         else//
//         {
//             res+=(bz[i].first*D);
//             D=0;
//         }
//     }
//     printf("%.2f",res);
// 	return 0;
// }
#include <bits/stdc++.h>
using namespace std;
struct node
{
    double w,v,x;
};

bool cmp(node a,node b)
{
    return a.x>b.x;
}

int main()
{
    int n,i;
    double d,sum=0;
    struct node a[1010];
    scanf("%d %lf",&n,&d);
    for(i=1;i<=n;i++)
    {
        scanf("%lf",&a[i].w);
    }
    for(i=1;i<=n;i++)
    {
        scanf("%lf",&a[i].v);
    }
    for(i=1;i<=n;i++)
    {
        a[i].x=(1.0*a[i].v)/a[i].w;
    }
    sort(a+1,a+n+1,cmp);
    for(i=1;i<=n;i++)
    {
        if(d>=a[i].w)
        {
            sum+=a[i].v;
            d-=a[i].w;
        }
        else
        {
            sum+=1.0*d*a[i].x;
            break;
        }
    }
    printf("%.2f\n",sum);
    return 0;
}

L2-004 这是二叉搜索树吗?


// #include<bits/stdc++.h>
// using namespace std;
// int a[1000000];
// int ok=1;
// vector<int>ans;
// void dfs(int l,int r)
// {
//     if(!ok)
//         return;
//     if(l>r)
//         return;
//     if(l==r)
//     {
//         ans.push_back(a[l]);
//         return ;
//     }
//     int val=a[l];
//     int i;
//     for(i=l+1;i<=r;i++)
//     {
//         if(a[i]>=val)
//            break;
//     }
//     // l+1 i-1
//     // [i,r]
//     for(int j=i;j<=r;j++)
//     {
//         if(a[j]<val)
//         {
//             ok=0;
//             return ;
//         }
//     }
//     dfs(l+1,i-1);
//     dfs(i,r);
//     ans.push_back(val);
// }
// void dfs2(int l,int r)
// {
//     if(!ok)
//         return;
//     if(l>r)
//         return;
//     if(l==r)
//     {
//         ans.push_back(a[l]);
//         return ;
//     }
//     int val=a[l];
//     int i;
//     for(i=l+1;i<=r;i++)
//     {
//         if(a[i]<val)
//            break;
//     }
//     // l+1 i-1
//     // [i,r]
//     for(int j=i;j<=r;j++)
//     {
//         if(a[j]>=val)
//         {
//             ok=0;
//             return ;
//         }
//     }
//     dfs2(l+1,i-1);
//     dfs2(i,r);
//     ans.push_back(val);
// }
// int main()
// {
   
//    int n;
//    cin>>n;
//     for(int i=0;i<n;i++)
//     {
//         cin>>a[i];
//     }
//     if(a[0]>a[1])//g z y
//     {
//         dfs(0,n-1);
//     }
//     else//g y z
//     {
//         dfs2(0,n-1);
//     }
//     if(!ok)
//     {
//         cout<<"NO";
//     }
//     else
//     {
//         cout<<"YES"<<endl;
//         for(int i=0;i<ans.size();i++)
//         {
     
//             if(i==0)
//                 cout<<ans[i];
//             else   
//                 cout<<" "<<ans[i];
//         }
//     }
// 	return 0;
// }


#include<bits/stdc++.h>
using namespace std;
int a[1000000];
int ok=0;
vector<int>ans;
struct Tree
{
    Tree* l;
    Tree* r;
    int val;
    Tree(Tree* l, Tree* r, int val){
        this->l = l;
        this->r = r;
        this->val =val;
    }
    Tree(){
        
    }
};
int judge=0;
// int ok=0;
int Max=-1;
void dfs(Tree *& root,int l,int r)
{
    
    if(l>r)
        return;

    root = new Tree(NULL,NULL,a[l]);
    int i=l+1;
    for(;i<=r;i++)
    {
        if(judge)
        {
            if(a[i]>=a[l])
            break;
        }
        else
        {
              if(a[i]<a[l])
            break;
        }
        
        
    }
    // [l+1,i-1]
    if(judge)
    {
         dfs(root->l,l+1,i-1);
          dfs(root->r,i,r);
    }
    else
    {
         dfs(root->l,i,r);
          dfs(root->r,l+1,i-1);
    }
   
}

void dfs2(Tree *&root)
{
    if(root==NULL)
        return;
    dfs2(root->l);
    dfs2(root->r);
    ans.push_back(root->val);
}

void dfs3(Tree *& root)
{
     if(root==NULL)
        return;
      
    if(ok)
        return;
  
    dfs3(root->l);
    if(root->val<Max)
    {
        ok=1;
        return;
    }
    Max=root->val;
    dfs3(root->r);
   
}
int main()
{
    
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
           cin>>a[i];
    if(n==1)
    {
        cout<< "YES";
        cout<<endl;
        cout<<a[0];
        return 0;
    }
    Tree *root= NULL;
    if(a[0]>a[1])
        judge=1;
     else
         judge=0;
   dfs(root,0,n-1);
    dfs2(root);
    dfs3(root);
    if(ok)
    {
        cout<<"NO"<<endl;
        return 0 ;
    }
    
    cout<<"YES"<<endl;
    cout<<ans[0];
    for(int i=1;i<ans.size();i++)
    {
        cout<<" "<<ans[i];
    }
    return 0;
}

L2-005 集合相似度


#include<bits/stdc++.h>
using namespace std;
unordered_set<int>G[100];
int main()
{
   int N;   
    cin>>N;
     int res;
     int n;
    for(int i=1;i<=N;i++)
    {
        scanf("%d",&n);
        for(int j=0;j<n;j++)
        {       
            scanf("%d",&res);
            G[i].insert(res);
        }
    } 
    int M;
    cin>>M;
    int x,y;    
    while(M--)//10^2
    {
        scanf("%d %d",&x,&y);
        int cnt=0;
        for(auto i : G[x])
        {     
           if(G[y].count(i))
               cnt++;//都有
        }
        int cn2=G[x].size()+G[y].size()-cnt;
        printf("%.2f%\n",cnt*1.0/cn2*100);
       
    }
	return 0;
}

L2-006 树的遍历


#include<bits/stdc++.h>
using namespace std;
int a[100000];
int b[100000];
struct NODE
{
	int val;
	NODE *l;
	NODE *r;
	NODE(int val,NODE *l,NODE *r)
	{
		this->val=val;
		this->l=l;
		this->r=r;
	 } 
};
//2 3 1 5 7 6 4 
//1 2 3 4 5 6 7
void dfs(NODE *&head,int i,int j,int i2,int j2)
{
    if(i>j||i2>j2)
        return ;
	head=new NODE(a[j],NULL,NULL);
	int k=i2;
	for(;k<=j2;k++)
		if(b[k]==a[j])//找到他 
			break;
	int cnt=k-i2;//前面一共多少个	
	dfs(head->l,i,i+cnt-1,i2,k-1);	
	dfs(head->r,i+cnt,j-1,k+1,j2);
}
int main()
{
   	int N;
   	cin>>N;
   	for(int i=0;i<N;i++) 
   	{
   		cin>>a[i];
	 }
	for(int i=0;i<N;i++)
	{
		cin>>b[i]; 
	}
	NODE *root=NULL;
	dfs(root,0,N-1,0,N-1);
	queue<NODE*>Q;
	Q.push(root);
	vector<int>ans;
	while(!Q.empty())
	{
		NODE *head=Q.front();
		Q.pop();
		ans.push_back(head->val);
		if(head->l!=NULL) Q.push(head->l);
		if(head->r!=NULL) Q.push(head->r); 
	}
	if(ans.size()!=0)
		cout<<ans.front();
	for(int i=1;i<ans.size();i++)
		cout<<" "<<ans[i];
	return 0;
}

L2-007 家庭房产

//编号 x  f[x]=x   

#include<bits/stdc++.h>
using namespace std;
unordered_map<string,string>f;//f[x]=y;
unordered_map<string,int>fc;
unordered_map<string,int>fcmj;
string Find(string x)
{
    if(x==f[x]) return x;
    return f[x]=Find(f[x]);
}
void Bond(string x,string y)
{
    string tx=Find(x);
    string ty=Find(y);
    if(tx!=ty) f[tx]=ty;
}

struct pyq
{
    int num;
    int n;
    string minbh;
    int s;
    //家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
    pyq(){
	}
    pyq(string minbh,int num,int n,int s)
    {
       this->minbh=minbh;
        this->n=n;
        this->num=num;
        this->s=s;
    }
};
bool cmp(pyq a1,pyq a2)
{
    double a=a1.s*1.0/a1.num;
    double b=a2.s*1.0/a2.num;
    if(a!=b)
    {
        return a>b;
    }
    else
        return a1.minbh<a2.minbh;
}

int main()
{
   
    int N;
    cin>>N;
    string Node;
    string fa;
    string ma;
    int k;
    f.clear();
//    unordered_map<int,int>
    while(N--)
    {
      //  6666 5551 5552 1 7777 1 100
        cin>>Node>>fa>>ma>>k;
        if(!f.count(Node))
            f[Node]=Node;
         if(!f.count(fa))
            f[fa]=fa;
        if(!f.count(ma))
            f[ma]=ma;
        if(fa!="-1")
          Bond(Node,fa);
        if(ma!="-1")
         Bond(Node,ma);
        for(int i=0;i<k;i++)
        {
            string ch;
            cin>>ch;
            if(!f.count(ch))
                f[ch]=ch;
            Bond(Node,ch);
        }
        cin>>fc[Node]>>fcmj[Node];
    }
    
    //计算有多少朋友圈,每个朋友圈的人 人均房产套数 人均房产面积
    
   unordered_map<string,pyq>vis;
   int sum=0;
   for(auto i : f)//遍历全部朋友圈
   {
	if(i.first=="-1") continue;
	string k=Find(i.first);
      if(!vis.count(k))//新的圈
      {
     	 	sum++;
          vis[k].num=1;
           vis[k].n=fc[i.first];
           vis[k].s=fcmj[i.first];
          vis[k].minbh=i.first;
          
      }
       else//老的圈
       {
           
           vis[k].num++;
           vis[k].n+=fc[i.first];
           vis[k].s+=fcmj[i.first];
           if(i.first<vis[k].minbh)
           {
               vis[k].minbh=i.first;
            }
       }
   }
   cout<<sum<<endl;
    vector<pyq>res;
    for(auto i :vis)
    {
        res.push_back(pyq(i.second.minbh,i.second.num,i.second.n,i.second.s));
    }
   sort(res.begin(),res.end(),cmp);
    for(auto i : res)//家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
    {
        cout<<i.minbh<<" "<<i.num<<" ";
        printf("%.3f ",i.n*1.0/i.num);
        printf("%.3f\n",i.s*1.0/i.num);
    }
    
	return 0;
}

L2-008 最长对称子串


#include<bits/stdc++.h>
using namespace std;
int dp[1002][1002];
int main()
{
    string s;
    getline(cin,s);
    int n=s.length();
    int Max=1;
//     for(int k=0;k<2*n-1;k++)
//     {
//        	int i=k/2;
//     	int j=k/2+k%2;
//         while(i>=0&&j<n)
//         {
//             if(s[i]==s[j])  
//             {
//                 i--;
//                 j++;
//             }else break;
//             Max=max(Max,j-i-1);
//         }
//     }
    for(int l=1;l<=n;l++)
    {
        for(int i=0;i<n-l+1;i++)
        {
            int j=i+l-1;
            if(l==1)
                dp[i][j]=1;
            else if(l==2)
            {
                if(s[i]==s[j])
                    dp[i][j]=1;
                
            } else
                dp[i][j]=(dp[i+1][j-1]&&(s[i]==s[j]));
            
            if(dp[i][j])
                Max=l;
        }
    }
    cout<<Max;
	return 0;
}

L2-009 抢红包

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int num;
    double s;
    int n;
    node(){}
    node(int num,int n,double s){
        this->num=num;
        this->s=s;
        this->n=n;
    }
    
};
bool cmp(node n1,node n2)
{//如果收入金额有并列,则按抢到红包的个数递减输出;如果还有并列,则按个人编号递增输出。
    if(n1.s!=n2.s)
    {
        return n1.s>n2.s;
    }
    else if(n1.n!=n2.n)
    {
        return n1.n>n2.n;       
    }
    else{
        return n1.num<n2.num;
    }
        
}
int main()
{
   int N;
    cin>>N;
    unordered_map<int,pair<int,int>>vis;
    for(int i=1;i<=N;i++)
    {
        int n;
        int sum=0;
        cin>>n;
        while(n--)
        {
           int je;
           int bh;
            cin>>bh>>je;
            sum+=je;
            if(!vis.count(bh))
            {
                vis[bh].first=je;
                vis[bh].second=1;
            }
            else
            {
                vis[bh].first+=je;
                vis[bh].second++;
            }
        }
        if(!vis.count(i))
        {
            vis[i].second=0;
            vis[i].first=-sum;
        }
        else
        {
            vis[i].first-=sum;
        }
    }
    vector<node>ans;
    for(auto i :vis)
    {     
        ans.push_back(node(i.first,i.second.second,i.second.first*1.0/100));
    }
    sort(ans.begin(),ans.end(),cmp);
    for(auto i :ans)
    {
        cout<<i.num<<" ";
		printf("%.2f\n",i.s);
     }
                      
	return 0;
}

L2-010 排座位

// #include<bits/stdc++.h>
// using namespace std;
// int Find(int x,int *f)
// {
//     if(x==f[x]) return x;
//     else return f[x]=Find(f[x],f);
// }
// void Bond(int x,int y,int *f)
// {
//     int tx=Find(x,f);
//     int ty=Find(y,f);
//     f[tx]=ty;
// }
// int f[100000];
// int df[100000];
// int main()
// {
//     /*如果两位宾客之间是朋友,且没有敌对关系,则输出No problem; 
//     如果他们之间并不是朋友,但也不敌对,则输出OK;
//     如果他们之间有敌对,然而也有共同的朋友,则输出OK but...;
//     如果他们之间只有敌对关系,则输出No way。*/
//     int N,M,K;
//     cin>>N>>M>>K;
//     int zjdd[200][200]={0};
//     for(int i=1;i<=N;i++)
//     {
//         f[i]=i;
//         df[i]=i;
//     }
//     while(M--)
//     {
//         int x,y,ok;
//         cin>>x>>y>>ok;
//         if(ok==1)//朋友
//         {
//             Bond(x,y,f);
//          }
//         else//敌人
//         {
//             Bond(x,y,df);
//             zjdd[x][y]=1;
//             zjdd[y][x]=1;
//         }
//     }
//      /*如果两位宾客之间是朋友,且没有敌对关系,则输出No problem; 
//     如果他们之间并不是朋友,但也不敌对,则输出OK;
//     如果他们之间有敌对,然而也有共同的朋友,则输出OK but...;
//     如果他们之间只有敌对关系,则输出No way。*/
//     while(K--)
//     {
//         int x,y;
//         cin>>x>>y;
//         if(Find(x,f)==Find(y,f)&&zjdd[x][y]==0)
//         {
//             cout<<"No problem"<<endl;
//             continue;
//         }
//         if(Find(x,f)!=Find(y,f)&&zjdd[x][y]==0) 
//         {
//             cout<<"OK"<<endl;
//             continue;
//         }
//        if(Find(x,f)==Find(y,f)&&Find(x,df)==Find(y,df))
//        {
//            cout<<"OK but..."<<endl;
//            continue;
//        }
//        if(zjdd[x][y]==1)
//        {
//            cout<<"No way"<<endl;
//            continue;
//        }
//     }
// 	return 0;
// }

#include<bits/stdc++.h>
using namespace std;
int f[200][2];
int Find(int x,int i)
{
    if(x==f[x][i])
        return x;
    return f[x][i] = Find(f[x][i],i);
}
void Band(int x,int y,int i)
{
    int tx = Find(x,i);
    int ty = Find(y,i);
    if(tx!=ty)
    {
        f[tx][i]=ty;
    }
}

int main()
{
    
    int N,M,K;
    cin>>N>>M>>K;
    for(int i=1;i<=N;i++)
    {
        f[i][0]=f[i][1]=i;       
    }
    while(M--)
    {
        int x,y,ok;
        cin>>x>>y>>ok;
        if(ok==1)//朋友
        {
            Band(x,y,1);
         }
        else//敌人
        {
            Band(x,y,0);
        }
    }
    while(K--)
    {
        int u,v;
        cin>>u>>v;
        int p1 = (Find(u,1)==Find(v,1));
        int p2 = (Find(u,0)==Find(v,0));
        
        if(p1&&!p2)
            cout<<"No problem";
        else if(!p1&&!p2)
            cout<<"OK";
        else if(p1&&p2)
            cout<<"OK but...";
        else 
            cout<<"No way";
        cout<<endl;
    }  
    return 0;
}

L2-011 玩转二叉树


#include<bits/stdc++.h>
using namespace std;
int a[100000];
int b[100000];
struct NODE
{
	int val;
	NODE *l;
	NODE *r;
	NODE(int val,NODE *l,NODE *r)
	{
		this->val=val;
		this->l=l;
		this->r=r;
	 } 
};
//
//4 1 3 2 6 5 7  q //a
//1 2 3 4 5 6 7 zho b
void dfs(NODE *&head,int i,int j,int i2,int j2)
{
	head=new NODE(a[i],NULL,NULL);
	int k=i2;
	for(;k<=j2;k++)
	{
		if(b[k]==a[i])//找到他  a是前 
		{
			break;
		}
	}
	int cnt=k-i2;//前面一共多少个
	if(k-1>=i2)//有左边 
		dfs(head->l,i+1,i+cnt,i2,k-1);
	if(k+1<=j2)//有右边 
		dfs(head->r,i+cnt+1,j,k+1,j2);
}
int main()
{
   	int N;
   	cin>>N;
   	for(int i=0;i<N;i++) 
   	{
   		cin>>b[i]; //中 
	 }
	for(int i=0;i<N;i++)
	{
		cin>>a[i];//前 
	}
	NODE *root=NULL;
	dfs(root,0,N-1,0,N-1);
	queue<NODE*>Q;
	Q.push(root);
	vector<int>ans;
	while(!Q.empty())
	{
		NODE *head=Q.front();
		Q.pop();
		ans.push_back(head->val);
		if(head->r!=NULL) Q.push(head->r);
		if(head->l!=NULL) Q.push(head->l); 
	}
	if(ans.size()!=0)
		cout<<ans[0];
	for(int i=1;i<ans.size();i++)
		cout<<" "<<ans[i];
	return 0;
}

L2-012 关于堆的判断


#include<bits/stdc++.h>
using namespace std;
int a[100000];
int b[100000];
struct NODE
{
	int val;
	NODE *l;
	NODE *r;
	NODE(int val,NODE *l,NODE *r)
	{
		this->val=val;
		this->l=l;
		this->r=r;
	 } 
};
//
//4 1 3 2 6 5 7  q //a
//1 2 3 4 5 6 7 zho b
void dfs(NODE *&head,int i,int j,int i2,int j2)
{
	head=new NODE(a[i],NULL,NULL);
	int k=i2;
	for(;k<=j2;k++)
	{
		if(b[k]==a[i])//找到他  a是前 
		{
			break;
		}
	}
	int cnt=k-i2;//前面一共多少个
	if(k-1>=i2)//有左边 
		dfs(head->l,i+1,i+cnt,i2,k-1);
	if(k+1<=j2)//有右边 
		dfs(head->r,i+cnt+1,j,k+1,j2);
}
int main()
{
   	int N;
   	cin>>N;
   	for(int i=0;i<N;i++) 
   	{
   		cin>>b[i]; //中 
	 }
	for(int i=0;i<N;i++)
	{
		cin>>a[i];//前 
	}
	NODE *root=NULL;
	dfs(root,0,N-1,0,N-1);
	queue<NODE*>Q;
	Q.push(root);
	vector<int>ans;
	while(!Q.empty())
	{
		NODE *head=Q.front();
		Q.pop();
		ans.push_back(head->val);
		if(head->r!=NULL) Q.push(head->r);
		if(head->l!=NULL) Q.push(head->l); 
	}
	if(ans.size()!=0)
		cout<<ans[0];
	for(int i=1;i<ans.size();i++)
		cout<<" "<<ans[i];
	return 0;
}

L2-013 红色警报


#include<bits/stdc++.h>
using namespace std;
int a[100000];
int b[100000];
struct NODE
{
	int val;
	NODE *l;
	NODE *r;
	NODE(int val,NODE *l,NODE *r)
	{
		this->val=val;
		this->l=l;
		this->r=r;
	 } 
};
//
//4 1 3 2 6 5 7  q //a
//1 2 3 4 5 6 7 zho b
void dfs(NODE *&head,int i,int j,int i2,int j2)
{
	head=new NODE(a[i],NULL,NULL);
	int k=i2;
	for(;k<=j2;k++)
	{
		if(b[k]==a[i])//找到他  a是前 
		{
			break;
		}
	}
	int cnt=k-i2;//前面一共多少个
	if(k-1>=i2)//有左边 
		dfs(head->l,i+1,i+cnt,i2,k-1);
	if(k+1<=j2)//有右边 
		dfs(head->r,i+cnt+1,j,k+1,j2);
}
int main()
{
   	int N;
   	cin>>N;
   	for(int i=0;i<N;i++) 
   	{
   		cin>>b[i]; //中 
	 }
	for(int i=0;i<N;i++)
	{
		cin>>a[i];//前 
	}
	NODE *root=NULL;
	dfs(root,0,N-1,0,N-1);
	queue<NODE*>Q;
	Q.push(root);
	vector<int>ans;
	while(!Q.empty())
	{
		NODE *head=Q.front();
		Q.pop();
		ans.push_back(head->val);
		if(head->r!=NULL) Q.push(head->r);
		if(head->l!=NULL) Q.push(head->l); 
	}
	if(ans.size()!=0)
		cout<<ans[0];
	for(int i=1;i<ans.size();i++)
		cout<<" "<<ans[i];
	return 0;
}

L2-014 列车调度

#include<bits/stdc++.h>
using namespace std;
int main()
{
		
    int N;
    cin>>N;
    set<int>vis;
    for(int i=0;i<N;i++)
    {
        int m;
        cin>>m;
        auto it=vis.lower_bound(m);//比大于或者等于他的第一个数
       if(it!=vis.end())
       {
           vis.erase(it);
       }
        vis.insert(m);
    }
    cout<<vis.size();
    return 0;
   }

L2-015 互评成绩

#include<bits/stdc++.h>
using namespace std;
int main()
{
	
    int N,M,K;
    cin>>N>>K>>M;
    vector<double>ans;
    while(N--)
    {
       double Max=-1;
        double Min=1000;
        double sum=0;
        double cj;
      for(int i=0;i<K;i++)
      {
          cin>>cj;
          Max=max(Max,cj);
          Min=min(Min,cj);
          sum+=cj;
      }
        double zjcj=(sum-Max-Min)*1.0/(K-2);
        ans.push_back(zjcj);
    }
    sort(ans.begin(),ans.end());
    int n=ans.size()-M;
  //  cout<<n<<"  ";
    if(n==-1)
        n=0;
    for(int i=n;i<ans.size()-1;i++)
       printf("%.3f ",ans[i]);
    printf("%.3f\n",ans[ans.size()-1]);
	return 0;
 } 

L2-016 愿天下有情人都是失散多年的兄妹

#include<bits/stdc++.h>
using namespace std;
unordered_map<string,vector<string> >G;
unordered_map<string,int>Xb;
unordered_map<string,int>vis;
int dfs(string x,int k)
{
    if(k==5)
        return 0;
    if(vis[x]==1)
        return 1;
    if(!G.count(x)) return 0;
    for(int i=0;i<G[x].size();i++)
    {
       
        if(dfs(G[x][i],k+1)==1)
            return 1;
    }
    return 0;
}
void dfs2(string x,int k)
{
    if(k==5)
        return ;
      vis[x]=1;
    if(!G.count(x)) return ;
    for(int i=0;i<G[x].size();i++)
    {
        dfs2(G[x][i],k+1);
    }
    return ;
}
int main()
{
    int N;
    string node;
    string fa;
    string ma;
    string xb;
    cin>>N;
    while(N--)
    {
        cin>>node>>xb>>fa>>ma;
        if(fa!="-1")
        {
            Xb[fa]=1;
            G[node].push_back(fa); 
        }
             
        if(ma!="-1")
        {
             G[node].push_back(ma); 
            Xb[ma]=-1;
        }
        if(xb=="M")
            Xb[node]=1;
        if(xb=="F")
            Xb[node]=-1;       
    }
    int K;
    cin>>K;
    string s1;
    string s2;
    while(K--)
    {
        cin>>s1>>s2;
        if(Xb[s1]==Xb[s2])
        {
            cout<<"Never Mind"<<endl;
            continue;
        }
        vis.clear();
        dfs2(s1,0);
        int ok=dfs(s2,0);
        if(ok==1)
        {
            cout<<"No"<<endl;
        }
        else
        {
            cout<<"Yes"<<endl;
        }
        
    }
    
	return 0;
 } 

L2-017 人以群分

//要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int N;
    cin>>N;
    vector<int>ans;
    int sum2=0;
    for(int i=0;i<N;i++)
    {
        int k;
        cin>>k;
        ans.push_back(k);
        sum2+=k;
    }
    sort(ans.begin(),ans.end());
    int k=ans.size()/2;
    int sum=0;
    for(int i=0;i<k;i++)
       sum+=ans[i];
    int diff=abs(sum2-2*sum);
    cout<<"Outgoing #: "<<ans.size()-k<<endl;
    cout<<"Introverted #: "<<k<<endl;
    cout<<"Diff = "<<diff<<endl;

 
	return 0;
 } 

L2-018 多项式A除以B


L2-019 悄悄关注

#include<bits/stdc++.h>
using namespace std;
int main()
{
    //全部标记
    //算平均 并把没有出现的人加入ve 
    vector<pair<string,int>>ans;
    unordered_map<string,int>vis;
    int N;
    cin>>N;
    while(N--)
    {
        string s;
        cin>>s;
        vis[s]=1;
    }
    
    int M;
    cin>>M;
    int MM=M;
    int sum=0;
    int k;
    string num;
    while(M--)
    {
        cin>>num>>k;
        sum+=k;
        if(!vis.count(num)) ans.push_back({num,k});
    }
    double pjs=sum*1.0/MM;
 //   cout<<pjs<<"  ";
    sort(ans.begin(),ans.end());
    int ok=0;
    for(auto i : ans)
    {
        if(i.second*1.0>pjs)
        {
            ok=1;
            cout<<i.first<<endl;
        }
    }
    if(ok==0)
          cout<<"Bing Mei You";
	return 0;
 } 

L2-020 功夫传人

#include<bits/stdc++.h>
using namespace std;
int n;
double z,r;
vector<int>G[100005];
double a[100005]={0};
double ans=0.0;
void dfs(int u,double res)
{
     if(a[u]!=0)//得到纸
    {
        ans+=res*a[u];
        return;
    }
       
    for(auto v : G[u])
    {
       
         dfs(v,res*(1-r/100));
    }
}
int main()
{
   cin>>n>>z>>r;
   for(int i=0;i<n;i++)
   {
       int x;
       cin>>x;
       if(x==0)//
       {
           double w;
           cin>>w;
           a[i]=w;
       }
       for(int j=0;j<x;j++)
       {
           int y;
           cin>>y;
           G[i].push_back(y);
       }
   }
    dfs(0,z);
    printf("%.f",ans-0.5);
    return 0;
}

L2-021 点赞狂魔

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    string s;
    int ps;
    int zps;
    Node(){}
    Node(string s,int ps,int zps)
    {
        this->s=s;
        this->ps=ps;
        this->zps==zps;                    
    }
    bool operator < (Node &n1)
    {
        if(this->s!=n1.s)
        {
            return this->ps>n1.ps;
        }
        else
        {
            return this->zps<n1.zps;
        }
    }
};
int main()
{
    int N;
    cin>>N;
    string s;
    int k;
    int bh;
    unordered_map<string,pair<int,int>>vis;//总票和票不同树
    unordered_map<int,int>ok;
    while(N--)
    {
        cin>>s>>k;
        vis[s].second=k;//总
        vis[s].first=0;
       ok.clear();
        for(int i=0;i<k;i++)
        {
            cin>>bh;
            if(!ok.count(bh))
            {
               vis[s].first++;
                ok[bh]=1;
                
            }
        }
    }
    vector<Node>res;
    for(auto i : vis)
    {
        res.push_back(Node(i.first,i.second.first,i.second.second));
    }
    sort(res.begin(),res.end());
    int nn=res.size();
    if(nn==0)
    {
        cout<<"- - -";
    }else
    {
        cout<<res[0].s;
        int nnn=nn>=3?3:nn;
         for(int i=1;i<nnn;i++)
        {
            cout<<' '<<res[i].s;
        }
        if(nn<3)
        {
            for(int i=0;i<3-nn;i++)
            {
                cout<<' '<<'-';
            }
        }
    }
 
	return 0;
    
 } 

L2-022 重排链表

#include<bits/stdc++.h>
using namespace std;
struct Node
{
  int val;
  int next;
}G[1000000];
// 1 2 3 
// 1 2 3 4
int main()
{
    int head;
    int N;
    cin>>head>>N;  
    int root;
    int next;
    int val;
    unordered_map<int,int>vis;
    for(int i=0;i<N;i++)
    {
        cin>>root>>val>>next;
        G[root].next=next;
        G[root].val=val;
    }
    int cnt=0;
    int data[1000000];
    for(int i=head;i!=-1;i=G[i].next)
    {
        data[cnt++]=i;
    }
    cnt--;
    vector<int>ans;
    int i=0;
    int j=cnt;
    while(1)
    {
        //1 2 3 4  5 6
       // i   j
       // 1  2
   //     i  j
        ans.push_back(data[j]);
        if(i==j) break;
        j--;
        ans.push_back(data[i]);
        i++;
        if(i-j==1)
          break;
        
    }
    for(int i=0;i<ans.size();i++)
    {
        if(i==0)
            printf("%05d %d ",ans[i],G[ans[i]].val);          
        else 
            printf("%05d\n%05d %d ",ans[i],ans[i],G[ans[i]].val);
    }
    cout<<-1;
	return 0;
    
 } 

L2-023 图着色问题

#include<bits/stdc++.h>
using namespace std;
vector<int>G[502];
int a[502];
int vis[502];
int ok2=0;
void dfs(int u)
{
    if(ok2)
       return;
    vis[u]=1;
    for(auto v : G[u])
    {
        if(!vis[v])
        {
            dfs(v);
        } else if(a[v]==a[u])
        {
            ok2=1;
            return ;
        }
        
    }
}
int main()
{
    int n,m,k;
    cin>>n>>m>>k;
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
      
    }
    int t;
    cin>>t;
    while(t--)
    {
        int cnt=0;
        ok2=0;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(!vis[a[i]])
            { vis[a[i]]=1;
             cnt++;
            };
         }
       if(cnt!=k)
       {
           cout<<"No"<<endl;
           continue;
       }
       memset(vis,0,sizeof(vis));
       for(int i=1;i<=n;i++)
       {
           if(!vis[i])
               dfs(i);
       }
        if(!ok2)
        {
            cout<<"Yes"<<endl;
        }
        else
        {
            cout<<"No"<<endl;
        }
    }
    return 0;
}

L2-024 部落

#include<bits/stdc++.h>
using namespace std;
int f[1000000];
int Find(int x)//查找它的祖先是谁 
{
	if(f[x]==x)
		return x;
	else
		return f[x]=Find(f[x]);
}
void Ban(int x,int y)//合并 
{
	int tx=Find(x);
	int ty=Find(y);
	if(tx!=ty)
	{
		f[ty]=tx;
	}
}
int main()
{
    int N;
    cin>>N;
    for(int i=0;i<=10000;i++)
        f[i]=i;
    int K;
    unordered_map<int,int>viss;
    set<int>res;
    while(N--)
    {
        cin>>K;
        int num;
        vector<int>ans;
        for(int i=0;i<K;i++)
        {
            cin>>num;
            viss[num]=1;
            ans.push_back(num);
            res.insert(num);
        }
        if(K>1)
            for(int i=0;i<ans.size()-1;i++)
            {
                 Ban(ans[i],ans[i+1]);
            }
    }
    set<int>rres;
    for(int i=1;i<=10000;i++)
    {
        if(viss.count(i))
        {
            rres.insert(Find(i));
        }
    }
    cout<<res.size()<<" "<<rres.size()<<endl;
    int M;
    cin>>M;
    while(M--)
    {
        int x,y;
        cin>>x>>y;
        if(Find(x)==Find(y))
             cout<<'Y'<<endl;
        else
            cout<<'N'<<endl;
    }
	return 0;
 } 

L2-025 分而治之


#include<bits/stdc++.h>
using namespace std;
int f[100000];
int Find(int x)//查找它的祖先是谁 
{
	if(f[x]==x)
		return x;
	else
		return f[x]=Find(f[x]);
}
void Ban(int x,int y)//合并 
{
	int tx=Find(x);
	int ty=Find(y);
	if(tx!=ty)
	{
		f[ty]=tx;
	}
}
struct Node
{
    int u;
    int v;
    
}G[100000];
int main()
{
    int N,E;
    cin>>N>>E;
    for(int i=1;i<=E;i++)
    {
        int x,y;
        cin>>x>>y;
        G[i].u=x;
        G[i].v=y;
    //    Ban(x,y);
    }
    int M;
    cin>>M;
    int gz[100000];
    while(M--)
    {
        int K;
        cin>>K;
        int x;
        memset(gz,0,sizeof(gz));
        for(int i=1;i<=N;i++)
            f[i]=i;           
        for(int i=0;i<K;i++)
        {
            cin>>x;
            gz[x]=-1;
        }       
        for(int i=1;i<=E;i++)
        {
            if(gz[G[i].u]!=-1&&gz[G[i].v]!=-1)
            {
                Ban(G[i].u,G[i].v);
            }
        }
        unordered_set<int>res;
            
        for(int i=1;i<=N;i++)//朋友圈个数
        {
        //    if(B)
            res.insert(Find(i));
        }
        //cout<<res.size()<<"   ";
        if(res.size()==N)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
	return 0;
 } 

L2-026 小字辈

#include<bits/stdc++.h>
using namespace std;
vector<int>G[1000000];
int d=0;
int vis[1000000];//
int Maxd=0;
void dfs(int k,int u)
{
    
    vis[u]=k;
    Maxd=max(Maxd,k);
    for(int i=0;i<G[u].size();i++)
    {
        dfs(k+1,G[u][i]);
    }
}
int main()
{
    //建图 输出最深度 深度为最s的那一层
    int N;
    cin>>N;
    for(int i=1;i<=N;i++)
    {
        int x;
        cin>>x;
        if(x!=-1)
            G[x].push_back(i);
        else
            G[100005].push_back(i);
    }
    dfs(0,100005);
    cout<<Maxd<<endl;
    vector<int>ans;
    for(int i=1;i<=N;i++)
        if(vis[i]==Maxd)
            ans.push_back(i);
   sort(ans.begin(),ans.end());
   if(ans.size()>=1)
       cout<<ans[0];
    for(int i=1;i<ans.size();i++)
    {
        cout<<" "<<ans[i];
    }
	return 0;
 } 

L2-027 名人堂与代金券

//成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。
#include<bits/stdc++.h>
using namespace std;
pair<string,int>p[10005];
int main()
{
    int N,G,k;
    cin>>N>>G>>k;
    int ans=0;
    for(int i=0;i<N;i++)
    {
        cin>>p[i].first>>p[i].second;
        if(p[i].second>=G)
        {
            ans+=50;
        }else if(p[i].second>=60)
        {
            ans+=20;
        }
    }
    sort(p,p+N,[](pair<string,int>n1,pair<string,int>n2){
        if(n1.second!=n2.second)
            return n1.second>n2.second;
        else        
            return n1.first<=n2.first;
    });
    int cnt=0;
    int per=-1;
    cout<<ans<<endl;
    for(int i=0;i<N;i++)
    {
        if(per==p[i].second)
        {
            cout<<cnt<<" "<<p[i].first<<" "<<p[i].second<<endl;
        }
        else
        {
            cnt=i+1;
            if(cnt<=k)
            {
                 cout<<cnt<<" "<<p[i].first<<" "<<p[i].second<<endl;
            }
            else
              break;
           
         }
        per=p[i].second;
    }
    return 0;
 } 

L2-028 秀恩爱分得快

#include<bits/stdc++.h>
using namespace std;
double a[1005];
double c[1005];
vector<int>G[1001][2];
bool ok[1005][1005];
int vis[1005][1005];
int n,m;
vector<int> f(string s)
{
    int num=atoi(s.data());
    int type;
    if(s[0]=='-')//女
        type=1,num=-num;
    else//男的
        type=0;
    double Max=0;
    memset(c,0,sizeof(c));
    for(int i=0;i<m;i++)
    {
        if(!vis[i][num])//他在不在这个照片里面  
            continue;
        for(auto num : G[i][type])//女
        {
            c[num]+=a[i];
            Max=max(Max,c[num]);
        }
    }
    vector<int>ans;
    for(int i=0;i<n;i++)
        if(Max==c[i])
        {           
            ok[i][num]=1;
            ans.push_back(i);
        }
    sort(ans.begin(),ans.end());
    return ans;
}
int main()
{
    
    cin>>n>>m;
    memset(vis,0,sizeof(vis));
    memset(ok,false,sizeof(ok));
    for(int i=0;i<m;i++)//1000
    {
        int k;
        cin>>k;
        a[i]=1.0/k;
        for(int j=0;j<k;j++)//500
        {
            string s;
            cin>>s;
            int num=atoi(s.data());
            if(num<0)
                num=-num;
            vis[i][num]=1;
            if(s[0]=='-')//女
               G[i][0].push_back(num);     
           else
               G[i][1].push_back(num);
        }
    }//500*500=150000000
    string x,y;
    cin>>x>>y;
    vector<int>ans1=f(x);
    vector<int>ans2=f(y);
    int num=abs(atoi(x.data()));
    int num2=abs(atoi(y.data()));
    if(ok[num][num2]&&ok[num2][num])
        cout<<x<<" "<<y<<endl;
    else
    {
        for(auto num : ans1)
        {
            if(x[0]=='-')
            {
                cout<<x<<" "<<num<<endl;
            }
            else
            {
                cout<<x<<" -"<<num<<endl;
            }
        }
        for(auto num : ans2)
        {
            if(y[0]=='-')
            {
                cout<<y<<" "<<num<<endl;              
            }
            else
            {
                cout<<y<<" -"<<num<<endl;
            }
        }
    }
    return 0;
}

L2-029 特立独行的幸福

//通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点
#include<bits/stdc++.h>
using namespace std;
vector<int>ans;
vector<int>res(100001);
int ss[100001]={0};
int ok(int u)
{
    unordered_map<int,int>re;
    int k=u;
    re[u]=1;
    while(1)
    {
        int v=k;
        k=0;
        while(v>0)
        {
            k=k+(v%10)*(v%10);
            v/=10;
        }
        if(re[k]==1)
            return -1;
        re[k]=1;
        ans.push_back(k);
        if(k==1)
        {
            res[u]=ans.size();
           return 1;          
        }
    } 
}
void f()
{
    int n=10001;
    for(int i=2;i<=sqrt(n+0.5);i++)
    {
        if(ss[i]==1)//不是素数
            continue;
        for(int j=i*i;j<=n;j+=i)
        {
            ss[j]=1;//不是素数;
        }
    }
}
int main()
{
		
    int x,y;
    cin>>x>>y;
    int vis[100001]={0};
    
    f();
    
    int judge=0;
    
    for(int i=x;i<=y;i++)//从推出去的所有数都不是 
    {
        if(vis[i]==1)
            continue;
        ans.clear();
       // cout<<ok(i)<<" ";
		if(ok(i)==-1)//这个数是循环
            vis[i]=1;//
       for(int i=0;i<ans.size();i++)
            vis[ans[i]]=1;//全部不是特别幸福
        
    }
    
  for(int i=x;i<=y;i++)
  {
  		//cout<<vis[i]<<" ";
      if(vis[i]==0)
      {
          judge=1;
          if(ss[i]==0)
                cout<<i<<" "<<res[i]*2<<endl;
            else
               cout<<i<<" "<<res[i]<<endl;
      }
  }
    if(judge==0)
        cout<<"SAD";
    return 0;
   }

L2-030 冰岛人


L2-031 深入虎穴

#include<bits/stdc++.h>
using namespace std;
vector<int>G[100005];
int vis2[100005]={0};
int Max=-1;
int Maxnum=2;
void dfs(int u,int k)
{
  
    for(int i=0;i<G[u].size();i++)
    {
       if(G[u][i]==0)
       {
           if(Max<k)
           {
               Max=k;
               Maxnum=u;
           }
        }
        else dfs(G[u][i],k+1);
    }
}
int main()
{
    int N;
    cin>>N;
    for(int i=1;i<=N;i++)
    {
        int K;
        cin>>K;
        if(K==0)
            G[i].push_back(K);
       else for(int j=0;j<K;j++)
        {
            int x;
            cin>>x;
            G[i].push_back(x);
            vis2[x]=1;
        }       
    }
    
    for(int i=1;i<=N;i++)
        if(vis2[i]==0)
              dfs(i,0);
    cout<<Maxnum;
    
	return 0;
 } 

L2-032 彩虹瓶

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int N,M,K;
    cin>>N>>M>>K;
    
    for(int i=0;i<K;i++)
    {
        stack<int>sk;
        while(!sk.empty()) sk.pop();
        int x;
        int cnt=1;//需要的
        int ok=0;
        for(int i=1;i<=N;i++)
        {
            cin>>x;
            if(ok==1)
                continue;
            while(!sk.empty()&&sk.top()==cnt)
            {
                cnt++;
                sk.pop();
            }
            if(cnt==x)
            {
                cnt++;
                 while(!sk.empty()&&sk.top()==cnt)
                {
                    cnt++;
                    sk.pop();
                }
            }
            else
            {
                sk.push(x);
            }
            if(sk.size()>M)
            {
             //   cout<<"NO"<<endl;
                ok=1;
            }
        }
        if(ok==1||cnt<=N)     
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
        
    }
	return 0;
 } 

L2-033 简单计算器

#include<bits/stdc++.h>
using namespace std;
int main()
{
    stack<int>s;
    stack<char>fh;
    int N;
    cin>>N;
    int num;
    for(int i=0;i<N;i++)
    {
        cin>>num;
        s.push(num);
    }
    char c;
    for(int i=0;i<N-1;i++)
    {
        cin>>c;
        fh.push(c);
    }
    while(!fh.empty())
    {
        int a1=s.top();
        s.pop();
        int a2=s.top();
        s.pop();
        char cc=fh.top();
        fh.pop();
        if(cc=='+')
        {
            s.push(a1+a2);
        }else if(cc=='-')
        {
            s.push(a2-a1);
        }else if(cc=='*')
        {
            s.push(a2*a1);
        }else{
            if(a1==0)
            {
                cout<<"ERROR: "<<a2<<"/0"<<endl;
                return 0;
            }
            else
                s.push(a2/a1);
        }
    }
    cout<<s.top();
	return 0;
 } 

L2-034 口罩发放


L2-035 完全二叉树的层序遍历

#include<bits/stdc++.h>
using namespace std;
int a[100];
struct N
{
    int val;
    int l;
    int r;
}Node[1005];
int cnt=-1;
int dfs(int l,int r,int k)
{
    if(l>r)
        return -1;
    int i=(r-l)/2;
    cnt++;
    int t=cnt;
    Node[t].l=dfs(l,r-i-1,k-1);
    Node[t].r=dfs(r-i,r-1,k-1);
    Node[t].val=a[r];
    return t;
}
int n;
void dfs2(int i)
{
    if(i>n)
      return ;
    dfs2(2*i);
    dfs2(2*i+1);
    cin>>a[i];
}
int main()
{
    
    cin>>n;
    dfs2(1);
    for(int i=1;i<=n;i++)
    {
        if(i==1)
            cout<<a[i];
        else
           cout<<" "<<a[i];
    }
//     for(int i=0;i<n;i++)
//         cin>>a[i];
//     int k=log2(n+1);
//     dfs(0,n-1,k);
//     queue<int>Q;
//     vector<int>ans;
//     Q.push(0);
//     while(!Q.empty())
//     {
//         int u=Q.front();
//         ans.push_back(Node[u].val);
//         Q.pop();
//         if(Node[u].l!=-1)
//         {
//             Q.push(Node[u].l);
//         }
//         if(Node[u].r!=-1)
//         {
//             Q.push(Node[u].r);
//         }
//     }
//     for(int i=0;i<ans.size();i++)
//     {
//         if(i==0)
//             cout<<ans[i];
//         else    
//             cout<<" "<<ans[i];
//     }
	return 0;
 } 

L2-036 网红点打卡攻略

#include<bits/stdc++.h>
using namespace std;
int main()
{
     int N,M;
    cin>>N>>M;
    int G[300][300]={0};
    while(M--)
    {
        int x,y,w;
        cin>>x>>y>>w;
        G[x][y]=w;
        G[y][x]=w;
    }
    int K;
    cin>>K;
    int Maxsum=INT_MAX;
    int Maxsum_num;
    int l=0;
    
    for(int i=1;i<=K;i++)
    {
        int n;
        cin>>n;
        unordered_map<int,int>vis;
        vector<int>ans(n+2);
        ans[0]=0;
        ans[n+1]=0;
        int ok=1;
        int sum=0;
        for(int j=1;j<=n;j++)
        {
            int u;
            cin>>u;
            if(ok==0)
                continue ;
            if(vis.count(u))//重复了
            {
                ok=0;
            }
            else
            {
                vis[u]=1;
                if(!G[u][ans[j-1]])//没有边
                {
                    ok=0;
                }
                else
                {
                    sum+=G[u][ans[j-1]];
                    ans[j]=u;
                }
            }
        }
         if(ok==0||vis.size()<N)
             continue ;
        if(G[ans[n]][ans[n+1]]!=0)
        {
            sum+=G[ans[n]][ans[n+1]];
        }
        else
            continue ;
        l++;
      // cout<<i<<" ";
        if(sum<Maxsum)
        {
            Maxsum=sum;
            Maxsum_num=i;
        }
        
    }
    cout<<l<<endl;
    cout<<Maxsum_num<<" "<<Maxsum;
	return 0;
 } 

L2-037 包装机

/*一种特殊情况是,因为筐的容量是有限的,当筐已经满了,但仍然有某条轨道的按钮被按下时,系统应强制启动 0 号键,先从筐里抓出一件物品,再将对应轨道的物品推落。
//
此外,如果轨道已经空了,再按对应的按钮不会发生任何事;
同样的,如果筐是空的,按 0 号按钮也不会发生任何事。*/
//定义N个stack  n// vector // stack sk
#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    int N,M,S;
    cin>>N>>M>>S;
   queue<int>Q[N+1];
    stack<int>sk;
    vector<int>ans;
    vector<int>temp;
    char c;
    for(int i=1;i<=N;i++)
    {
        for(int j=0;j<M;j++)
        {
            cin>>c;
            Q[i].push(c);
        }      
    }
    int num;
    while(1)
    {
        cin>>num;
        if(num==-1)
            break;
        if(num==0)
        {
            if(sk.size()==0)
                 continue;
            else
            {
               int wp= sk.top();
                sk.pop();
                ans.push_back(wp);
            }
            continue;
        }
        else//按了其他
        {
            if(Q[num].size()==0)//没有东西
                 continue;
            if(sk.size()>=S)//满了拿掉一个
            {
                int wp= sk.top();
                sk.pop();
                ans.push_back(wp);               
            }
           int wpp=Q[num].front();
            Q[num].pop();
            sk.push(wpp);          
        }
    }
    int n=ans.size();
    

    for(int i=0;i<n;i++)
    {
        cout<<(char)ans[i];
    }
	return 0;
 } 

L2-038 病毒溯源

#include<bits/stdc++.h>
using namespace std;
vector<int>G[10001];
vector<int>ans;
vector<int>temp;
int Maxd=0;
void dfs(int u,int k)
{
    if(G[u].size()==0)
    {
        if(k>Maxd)
        {
            ans=temp;
            ans.push_back(u);
            Maxd=k;
        }
        return ;
    }
   
    for(int i=0;i<G[u].size();i++)
    {
        temp.push_back(u);
         dfs(G[u][i],k+1);
        temp.pop_back();
    }    
}
int vis[100000]={0};
int main()
{
    int N;
    cin>>N;
    for(int i=0;i<N;i++)
    {
        int K;
        int x;
        cin>>K;
      
            
        while(K--)
        {
            cin>>x;
            G[i].push_back(x);
            vis[x]=1;
        }
    }
    int k;
     for(int i=0;i<N;i++)
    {
         if(vis[i]==0) k=i;
        sort(G[i].begin(),G[i].end());
    }
      dfs(k,1);
    cout<<Maxd<<endl;
    
    if(ans.size()!=0)
        cout<<ans[0];
    for(int i=1;i<ans.size();i++)
        cout<<" "<<ans[i];
	return 0;
 } 

L2-039 清点代码库

#include<bits/stdc++.h>
using namespace std;  
struct Node
{
    int cnt;
    vector<int>ans;
}node[10005];
map<vector<int>,int>vis;
int main()
{
    int N,M;
    cin>>N>>M;
    getchar();
    for(int i=0;i<N;i++)//10000
    {
        string s;
        vector<int>t;
        for(int j=0;j<M;j++)
        {
            int x;
            cin>>x;
            t.push_back(x);
        }
        vis[t]++;
    }
    int cnt=0;
    stringstream ss;
    for(auto it : vis)
    {
        node[cnt].ans=it.first; 
        node[cnt++].cnt=it.second;
    }
    sort(node,node+cnt,[](const Node &n1,const Node &n2){
        if(n1.cnt!=n2.cnt)
            return n1.cnt>n2.cnt;
        else
        {
          for(int i=0;i<n1.ans.size();i++)
          {
              if(n1.ans[i]!=n2.ans[i])
                  return n1.ans[i]<n2.ans[i];
          }
        }
    });
    cout<<cnt<<endl;
    for(int k=0;k<cnt;k++)
    {
        cout<<node[k].cnt;
        for(int i=0;i<node[k].ans.size();i++)
        {
            cout<<" "<<node[k].ans[i];
        }
        cout<<endl;
    }
	return 0;
 } 

L2-040 哲哲打游戏

//通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点
#include<bits/stdc++.h>
using namespace std;
vector<int>G[100002];
int main()
{
		
    int N,M;
    cin>>N>>M;
    for(int i=1;i<=N;i++)
    {
        int k;
        cin>>k;
        while(k--)
        {
            int x;
            cin>>x;
            G[i].push_back(x);
        }
    }   
    unordered_map<int,int>vis;
    int u=1;
    while(M--)
    {
        int judge,xz;
        cin>>judge>>xz;
        if(judge==0)
        {
            u=G[u][xz-1];
        }
        else if(judge==1)
        {
            vis[xz]=u;
            cout<<u<<endl;
        }
        else
        {
            u=vis[xz];
        }
       
    }
    cout<<u;
    return 0;
   }

L2-041 插松枝

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
vector<int>ans[N];
int cnt=0;
 bool ok(int num)
 {
 	
   int ss = ans[cnt].size();
   if(ss==0)
   		return true;
   if(ans[cnt][ss-1]>=num)
          return true;
    return false;
 }
int main(){
    
    int n,m,k;
    // n:松针片的数量
    // m:小盒子能存放的松针片的最大数量
    // k:一根松枝干上能插的松针片的最大数量
    cin>>n>>m>>k;
    //推送器
    queue<int>q;
    int t;
   for(int i=0;i<n;i++)
   {
       cin>>t;
       q.push(t);
   }
    //盒子
   stack<int>s;
 
   while(!s.empty()||!q.empty())
   {
       int num;
       //从盒子拿且可以插
       if(!s.empty()&&ok(s.top()))
       {
           num = s.top();
           s.pop();
           //插
           ans[cnt].push_back(num);
           
       }else //小盒子上面没有,或者盒子上面松针不满足要求
       {
           while(1)
		   {
		   	   if(!q.empty())  //传送带有
	           {
	               num = q.front();
	               
	               //可以插
	               if(ok(num)) 
	               {
	                   ans[cnt].push_back(num);
	                   q.pop();
	                   break;
	               }
	               else //不可以插,放盒子上,
	               {
	                   if(s.size()==m) //(1)盒子满了,推送器上取到的松针压回推送器,开始下一根松枝的制作。
	                   {
	                       cnt++;
	                       break;
	                      
	                   }
	                   else //盒子没满放盒子上 然后继续去推送器上取下一片 
	                   {
	                       s.push(num);
	                    	q.pop();
	                       
	                   }
	               }
	           }
	           else //传送带没有,盒子上面松针又不满足要求
	           {
	               //(2)  
	               cnt++;
	               break;
	           }
		   } 
         
       }
       
       //(3)插满了
       if(ans[cnt].size()==k)
       {
           cnt++;
       }     
   }
    
    
    for(int i=0;i<=cnt;i++)
    {
    	if(ans[i].size()==0)
    		break;
        for(int j=0;j<ans[i].size();j++)
        {
            if(j==0)
                cout<<ans[i][j];
            else
                cout<<" "<<ans[i][j];
        }
        cout<<endl;
    }
    return 0;
}
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值