团体程序设计天梯赛-练习集L2(4.17)

8 篇文章 0 订阅

L2-001 紧急救援 (25 分)

最短路问题:

#include <bits/stdc++.h>
using namespace std;
const int N = 605;
int n, m, c1, c2;
int g[N][N], dist[N], cnt[N], st[N], sum[N], w[N]; //cnt是道路的条数,sum是救援队总数,w是救援队
void dij()
{
    memset(dist, 0x3f, sizeof dist);
    dist[c1] = 0, sum[c1] = w[c1], cnt[c1] = 1;
    for (int i = 0; i < n; i++)
    {
        int t = -1;
        for (int j = 0; j < n; j++)
        {
            if (!st[j] && (t == -1 || dist[j] < dist[t]))
            {
                t = j;
            }
        }
        st[t] = 1;

        for (int j = 0; j < n; j++)
        {
            if (dist[j] > dist[t] + g[t][j])
            {
                dist[j] = dist[t] + g[t][j];
                sum[j] = sum[t] + w[j];
                cnt[j] = cnt[t];
            }
            else if (dist[j] == dist[t] + g[t][j])
            {
                cnt[j] += cnt[t];
                sum[j] = max(sum[j], sum[t] + w[j]);
            }
        }
    }
    cout << cnt[c2] << " " << sum[c2];
}
int main()
{
    memset(g, 0x3f, sizeof g);
    cin >> n >> m >> c1 >> c2;
    for (int i = 0; i < n; i++)
    {
        cin >> w[i];
    }
    while (m--)
    {
        int a, b, c;
        cin >> a >> b >> c;
        g[a][b] = min(g[a][b], c);
        g[b][a] = min(g[b][a], c);
    }
    dij();
}

L2-002 链表去重 (25 分)

L2-003 月饼 (25 分)

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
struct node{
    double a;
    double b;
    double c;
}moon[N];
bool cmp(node x,node y){
    return x.c>y.c;
    
}

int main(){

     int n,d;
    cin>>n>>d;
    for(int i=1;i<=n;i++){
        cin>>moon[i].a;
    }
    for(int i=1;i<=n;i++){
        cin>>moon[i].b;
        moon[i].c=(moon[i].b)/moon[i].a;
    }
    sort(moon+1,moon+1+n,cmp);
    int j=1;
    double ans=0;

    while(d>0&&j<=n){         //被坑了一个点,j<=n  当最大库存大于0但圆饼全部卖完时也break
        if(d>=moon[j].a){
            ans+=(moon[j].b);
            d-=moon[j].a;
        }
        else{
            ans+=(d/moon[j].a)*(moon[j].b);
            d=0;
        }
        j++;
    }
    printf("%.2f",ans);
    
}

L2-004 这是二叉搜索树吗? (25 分)

L2-005 数叶子节点(25 分)

#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
vector<int> v[N];
int d[N]; // 叶子节点个数s
int maxdepth;
void dfs(int u,int depth){
    if(!v[u].size()){
    d[depth]++;
    maxdepth = max(maxdepth, depth);
    return ;
    }
    for (int i = 0; i < v[u].size();i++){
        dfs(v[u][i], depth + 1);
    }
}
int main()
{
    int n, m;
    cin >> n >> m;
    while(m--){
        int id, k;
        cin >> id >> k;
        for (int i = 0; i < k;i++){
            int son;
            cin >> son;
            v[id].push_back(son);
        }
    }
    dfs(1, 0);
    cout<<d[0];
    for (int i = 1; i <=maxdepth;i++){
        cout << " "<<d[i];
    }
}

L2-006 树的遍历 (25 分)

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>

using namespace std;

const int N = 40;

int n;
int postorder[N], inorder[N];
unordered_map<int, int> l, r, pos;
int q[N];

int build(int il, int ir, int pl, int pr)
{
    int root = postorder[pr];
    int k = pos[root];
    if (il < k) l[root] = build(il, k - 1, pl, pl + (k - 1 - il));
    if (k < ir) r[root] = build(k + 1, ir, pl + (k - 1 - il) + 1, pr - 1);
    return root;
}

void bfs(int root)
{
    int hh = 0, tt = 0;
    q[0] = root;

    while (hh <= tt)
    {
        int t = q[hh ++ ];
        if (l.count(t)) q[ ++ tt] = l[t];
        if (r.count(t)) q[ ++ tt] = r[t];
    }

    cout << q[0];
    for (int i = 1; i < n; i ++ ) cout << ' ' << q[i];
    cout << endl;
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> postorder[i];
    for (int i = 0; i < n; i ++ )
    {
        cin >> inorder[i];
        pos[inorder[i]] = i;
    }

    int root = build(0, n - 1, 0, n - 1);

    bfs(root);

    return 0;
}

题解:acwing

L2-008 最长对称子串 (25 分)

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    getline(cin,s);
      int ans=-1;
    for(int i=0;i<s.size();i++)
    {
        for(int j=s.size()-1;j>=i;j--)
        {
            int l=i,r=j;
            while(s[l]==s[r] && l<=r)
            {
                l++;
                r--;
            }
            if(l>r)
            {
                ans=max(ans,j-i+1);
            }
        }
    }
    cout<<ans;
}

L2-010 排座位 (25 分)

#include<bits/stdc++.h>
using namespace std;
int par[1001],enm[1111][1111];

int find(int x){
    return par[x]==x?x:par[x]=find(par[x]);
}


void unite(int x,int y){
    x=find(x);
    y=find(y);
    if(x!=y){
        par[y]=x;
    }
}
int main(){
    memset(enm,0,sizeof enm);
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++){
        par[i]=i;
    }
    for(int i=1;i<=m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(c==1){
            unite(a,b);
           
        }
        else{
            enm[a][b]=1;
            enm[b][a]=1;
        }
        
    }
    while(k--){
        int a,b;
        cin>>a>>b;
         if(find(a)==find(b)&&enm[a][b]==0){
       printf("No problem\n");}
        else if(find(a)==find(b)&&enm[a][b]==1){
           printf("OK but...\n");
        }
        else if(find(a)!=find(b)&&enm[a][b]==0){
                printf("OK\n");
        }
       
        
        else {
            printf("No way\n");
        }
    }
}

L2-029 特立独行的幸福 (25 分)

谷歌的招聘

#include<iostream>
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
 
bool isPrimer(int a)
{
    bool flag=true;
        for(int i=2; i<sqrt(a); i++)
        {
            if(a%i==0)
            {
                flag=false;
                break;
            }
        }
    return flag;
}
 
int main()
{
    int L,K,p;
    cin>>L>>K;
    getchar();
    string s,b;
    getline(cin,s);
    if(s.length()>=K)
    {
        for(int i=0; i<=s.length()-K; i++)
        {
            b=s.substr(i,K);		//itoa(number, string,10)数字变字符
            p=atoi(b.c_str());       //  stoi(s)字符串转数字
            if(isPrimer(p))
            {
                cout<<b;
                return 0;
            }
        }
    }
        cout<<"404";
    return 0;
}

L2-013 红色警报

#include<bits/stdc++.h>
using namespace std;
int par[100001],fail[100001]={0};
struct node{
   int u;
   int v;

}edge[100001];
int find(int u){
   return u==par[u]?u:par[u]=find(par[u]);
}
void unite(int x,int y){
   x=find(x); y=find(y);
   if(x!=y)  {
      par[x]=y;
   }
}

int main(){
   int n,m;
  int num1=0;
   cin>>n>>m;
    for(int i=0;i<n;i++){
       par[i]=i;
    }
   for(int i=0;i<m;i++){
      cin>>edge[i].u>>edge[i].v;
      unite(edge[i].u,edge[i].v);
   }
    for(int i=0;i<n;i++){
       if(par[i]==i){
          num1++;
       }
    }
   memset(fail,0,sizeof fail);
   int k;
   cin>>k;
   while(k--){
   
      int num2=0;
      for(int i=0;i<n;i++){
       par[i]=i;
    }
      int q;
      cin>>q;
      fail[q]=1;
       for(int i=0;i<m;i++){
      if(fail[edge[i].u]==1||fail[edge[i].v]==1)
      continue;
      else
      unite(edge[i].u,edge[i].v);
   }
   for(int i=0;i<n;i++){
       if(par[i]==i){
          num2++;
       }
    }
    if(num1==num2||num1+1==num2){
       cout<<"City "<<q<<" is lost."<<endl;
    }
    else{
  cout<<"Red Alert: City "<<q<<" is lost!"<<endl;
    }
    num1 = num2;
  

   }
   int ans=0;
   for(int i=0;i<n;i++){
        if(fail[i]){
            ans++;
        }
    }
    if(ans==n)cout<<"Game Over."<<endl;

 
}

L2-014 列车调度

#include<bits/stdc++.h>
using namespace std;
set<int> st;
int main(){
    int n;
   
    cin>>n;
    for(int i=1;i<=n;i++){
        int k;
        cin>>k;
        auto it=st.lower_bound(k);
        if(it!=st.end()){
            st.erase(it);
            st.insert(k);
        }
        else{
            st.insert(k);
        }
    }
    cout<<st.size();
}

L2-015 互评成绩

#include<bits/stdc++.h>
const int N=100005;
#define LL long long
using namespace std;
int q[N][11];
double d[N];
int main(){
  int n,m,k;
  cin>>n>>m>>k;
  for(int i=0;i<n;i++){
    int ma=0,mi=101;
    for(int j=0;j<m;j++){
      scanf("%d",&q[i][j]); 
      if(ma<q[i][j])ma=q[i][j];
      if(mi>q[i][j])mi=q[i][j];
    }
    d[i]=(accumulate(q[i],q[i]+m,0)-ma-mi)*1.0/(m-2);
  }
  sort(d,d+n);
    printf("%.3f",d[n-k]);
  for(int i=n-k+1;i<n;i++){
 printf(" %.3f",d[i]);
  }
}

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

#include<bits/stdc++.h>
using namespace std;
int n,t;
const int  N=100005;
bool  st[N];
bool flag=0;
vector<int>  ve[N];
char sex[N];
void dfs(int x,int num){
    if(num>=4)return ;
    for(int i=0;i<ve[x].size();i++){
        if(!st[ve[x][i]]){
            st[ve[x][i]]=1;
            dfs(ve[x][i],num+1);
        }
        else{
            flag=1;
            return ;
        }
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        int k;
        char c;
        int x,y;
        scanf("%d %c %d %d",&k,&c,&x,&y);
        sex[k]=c;
        if(x!=-1){
            ve[k].push_back(x);
            sex[x]='M';
        }
        if(y!=-1){
            ve[k].push_back(y);
            sex[y]='F';
        }

    }
 
    cin>>t;
    while(t--){
        flag=0;
        int x,y;
        memset(st,0,sizeof st);
        cin>>x>>y;
        if(sex[x]==sex[y]){
            puts("Never Mind");
        }
        else{
        dfs(x,0);
        dfs(y,0);
        if(flag){puts("No");}
        else{puts("Yes");}
        }
    }

}

L2-017 人以群分

#include<bits/stdc++.h>
using namespace std;
int a[10000002];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    int n1=accumulate(a,a+n/2,0);
    int n2=accumulate(a+n/2,a+n,0);
    if(n%2==0){
        cout<<"Outgoing #: "<<n/2<<endl;
         cout<<"Introverted #: "<<n/2<<endl;
         cout<<"Diff = "<<abs(n2-n1)<<endl;

    }
    else{     
         cout<<"Outgoing #: "<<n/2+1<<endl;
         cout<<"Introverted #: "<<n/2<<endl;
         cout<<"Diff = "<<abs(n2-n1)<<endl;

    }
    }
    

L2-019 悄悄关注

#include<bits/stdc++.h>
using namespace std;
map <string,int> mp;
int main(){
    int n;
    string s[40001];
    cin>>n;

    int sum=0;
    for(int i=0;i<n;i++){
        cin>>s[i];
        mp[s[i]]=-1;
        }
        int t;
        bool flag=0;
        cin>>t;
        string str;
        int num;
        int m=t;
        while(t--){
            cin.get();
            cin>>str>>num;
            
            sum+=num;
            // int cnt=str[0]*8+str[1]*4+str[2]*2+str[3];
            if(mp[str]!=-1){
                mp[str]=num;
            }
        }
          int ave=sum/m;
        for(auto it : mp){
            if(it.second>ave){
                flag=1;
                cout<<it.first<<endl;
            }


        }
      
        if(!flag){cout<<"Bing Mei You";}
    }
    

L2-020 功夫传人

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
bool st[N];
double z,r;
vector<int> ve[N];
double sum=0;
void dfs(int idx,double power){
    if(st[idx]){
    sum+=ve[idx][0]*power;
    return ;}

    for(int i=0;i<ve[idx].size();i++){
        dfs(ve[idx][i],power*(1-r));
    }
} 
int main(){
    int n;
    cin>>n>>z>>r;
    r=r/100;
    int k;
     int x;
    for(int i=0;i<n;i++){
        cin>>k;
        if(!k){
           
            cin>>x;
            st[i]=1;
            ve[i].push_back(x);
        }
        else{
            for(int j=0;j<k;j++){
                cin>>x;
                ve[i].push_back(x);
            }
        }
    }
    dfs(0,z);
   cout<<(int)sum;

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值