ACM/ICPC培训(古风排版,悄悄关注,病毒溯源)

                               古风排版

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:

4
This is a test case

输出样例:

asa T
st ih
e tsi
 ce s

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<iostream>
using namespace std;
int main(){
    int N,M,L;
    string s1;
    cin>>N;
    getchar();
    getline(cin,s1);
    L=s1.size();
    M=(L%N==0)?L/N:L/N+1;
    string s2(M*N-L,' ');
    s1+=s2;
    string str[N];
    for(int i=0;i<s1.size();i++){
        str[i%N]=s1[i]+str[i%N];
        
    }
    for(int j=0;j<N;j++){
        cout<<str[j]<<endl;
    }
    return 0;
}

                           悄悄关注

输入首先在第一行给出某用户的关注列表,格式如下:

人数N 用户1 用户2 …… 用户N

其中N是不超过5000的正整数,每个用户ii=1, ..., N)是被其关注的用户的ID,是长度为4位的由数字和英文字母组成的字符串,各项间以空格分隔。

之后给出该用户点赞的信息:首先给出一个不超过10000的正整数M,随后M行,每行给出一个被其点赞的用户ID和对该用户的点赞次数(不超过1000),以空格分隔。注意:用户ID是一个用户的唯一身份标识。题目保证在关注列表中没有重复用户,在点赞信息中也没有重复用户。

输出格式:

我们认为被该用户点赞次数大于其点赞平均数、且不在其关注列表上的人,很可能是其悄悄关注的人。根据这个假设,请你按用户ID字母序的升序输出可能是其悄悄关注的人,每行1个ID。如果其实并没有这样的人,则输出“Bing Mei You”。

输入样例1:

10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60

输出样例1:

Ammy
Cath
Pota

输入样例2:

11 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao Pota
7
Magi 50
Pota 30
LLao 48
Ammy 3
Dave 15
GAO3 31
Zoro 29

输出样例2:

Bing Mei You

代码长度限制

16 KB

时间限制

200 ms

内存限制

64 MB

#include<iostream>
#include<set>
#include<map>
using namespace std;
set<string>a;
map<string,int>b;
int main(){
    int n;
    cin>>n;
    for(int i =0;i<n;i++){
        string s;
        cin>>s;
        a.insert(s);
    }
    int m;
    cin>>m;
    int sum=0;
    double avg;
    for(int i=0;i<m;i++){
        string s;
        int num;
        cin>>s>>num;
        sum+=num;
        if(a.find(s)==a.end()){
            b.insert(map<string,int>::value_type(s,num));
        }
    }
    avg=(double)sum/m;
    int flag=0;
    map<string,int>::iterator it;
    for(it=b.begin();it!=b.end();it++){
        if((double)it->second>avg){
            cout<<it->first<<endl;
            flag=1;
        }
}
    if(flag==0)
        cout<<"Bing Mei You";
    return 0;
}

病毒溯源

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。

现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。

在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变异问题 —— 即每一种病毒都是由唯一的一种病毒突变而来,并且不存在循环变异的情况。

输入格式:

输入在第一行中给出一个正整数 N(≤104),即病毒种类的总数。于是我们将所有病毒从 0 到 N−1 进行编号。

随后 N 行,每行按以下格式描述一种病毒的变异情况:

k 变异株1 …… 变异株k

其中 k 是该病毒产生的变异毒株的种类数,后面跟着每种变异株的编号。第 i 行对应编号为 i 的病毒(0≤i<N)。题目保证病毒源头有且仅有一个。

输出格式:

首先输出从源头开始最长变异链的长度。

在第二行中输出从源头开始最长的一条变异链,编号间以 1 个空格分隔,行首尾不得有多余空格。如果最长链不唯一,则输出最小序列。

注:我们称序列 { a1​,⋯,an​ } 比序列 { b1​,⋯,bn​ } “小”,如果存在 1≤k≤n 满足 ai​=bi​ 对所有 i<k 成立,且 ak​<bk​。

输入样例:

10
3 6 4 8
0
0
0
2 5 9
0
1 7
1 2
0
2 3 1

输出样例:

4
0 4 9 1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<bits/stdc++.h>
#define llu unsigned long long 
using namespace std;
vector<int>vis[10010];
queue<pair<int,int>>q;
stack<int>f;
bool in[10010];
int before[10010];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int k;
        cin>>k;
        for(int j=0;j<k;j++){
            int x;
            cin>>x;
            in[x]=1;
            before[x]=i;
            vis[i].push_back(x);
        }
        sort(vis[i].begin(),vis[i].end());
    }
    int begin;
    for(int i=0;i<n;i++){
        if(in[i]==0)
            begin=i;
    }
    int maxl=-1,ans=begin;
    q.push({begin,1});
    while(!q.empty()){
        int now=q.front().first,l=q.front().second;
        q.pop();
        if(l>maxl){
            maxl=l;
            ans=now;
        }
        for(int i =0;i<vis[now].size();i++){
            q.push({vis[now][i],l+1});
        }
    }
    cout<<maxl<<endl;
    while(ans!=begin){
        f.push(ans);
        ans=before[ans];
    }
    cout<<begin;
    int t=f.size();
    for(int i=0;i<t;i++){
        cout<<" "<<f.top();
        f.pop();
    }
    return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁的梁小忠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值