河南萌新联赛2024第(二)场:南阳理工学院

国际旅行Ⅰ

题目

很久很久以前,有 n n n 个国家,第 i i i 个国家有 a i a_{i} ai 个城市,国家之间一共修建了 m m m 条双向道路,保证各个国家之间可以相互到达,正在旅行的小龙向你提出了 q q q 个问题,问你从第一个国家能到达的城市数量第 k k k 少的国家 有多少个城市,请你帮他找到答案。

输入

第一行给定三个整数 n , m , q n,m,q n,m,q 分别表示国家数量,道路数量以及询问的个数。

第二行输入 n n n 个正整数第 i i i 个数 a i a_{i} ai 表示第 i i i 个国家城市的数量。

接下来 m m m 行,每行两个正整数 u , v u,v u,v,表示 u u u 国和 v v v 国之间有一条双向道路。

接下来 q q q 行每行1个整数 k k k ,表示小龙他的问题。

保证

1 ≤ n ≤ 1000 1\leq n \leq 1000 1n1000

n − 1 ≤ m ≤ n ∗ ( n − 1 ) / 2 n-1 \leq m \leq n * (n - 1) / 2 n1mn(n1)/2

1 ≤ a i ≤ 100000 1 \leq a_{i} \leq 100000 1ai100000

1 ≤ u , v ≤ n 1\leq u,v\leq n 1u,vn

1 ≤ k ≤ n 1 \leq k \leq n 1kn,

输出

输出共 q q q行,每行输出一个整数表示第 i i i个问题的答案。

AC代码

// 排序输出
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1010];
signed  main()
{
    int n,m,q;cin>>n>>m>>q;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    while(m--)
    {
        int u,v;
        cin>>u>>v;
    }
    sort(a,a+n);
    while(q--)
    {
        int x;cin>>x;
        cout<<a[x-1]<<'\n';
    }
    return 0;
}

A*BBBB

题目

集训队的 l o n g l o n g longlong longlong同学刚学完c语言基础后,非常高兴的开始做题,但是突然有一题难住了 l o n g l o n g longlong longlong同学。题面如下:
t t t组输入,每组输入给两个整数 a a a b b b,输出 a ∗ b a*b ab。但是 a , b a,b a,b非常大, 0 < = a , b < = 1 0 1000000 0<=a,b<=10^{1000000} 0<=a,b<=101000000。其中 b b b的每一位都相同,且 a , b a,b a,b都不含前导0。
l o n g l o n g longlong longlong同学写不出题太痛苦了,于是请求你帮帮他。

输入
第1行输入一个 t t t表示 t t t组输入 ( 1 < = t < = 10 ) (1<=t<=10) 1<=t<=10)
第2到 2 ∗ t + 1 2*t+1 2t+1行,每组给出两行,分别是 a , b a,b a,b 1 ≤ ∣ a ∣ , ∣ b ∣ ≤ 1 e 6 1\leq|a|,|b|\leq1e6 1a,b1e6.
∣ a ∣ |a| a表示 a a a的长度

输出
输出t行,每行一个整数,表示 a ∗ b a*b ab的答案

AC代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
    int T;
    cin >> T;
    while(T --)
    {
        string a,b;
        cin >> a >> b;
        reverse(a.begin(),a.end());
        string ans;
        int cur = 0,cur2 = 0;
        for(int i = 0;i < a.size() + b.size();i ++)
        {
            if(i < a.size()) cur += a[i] - '0';
            if(i - b.size() >= 0 && i - b.size() < a.size()) cur -= a[i - b.size()] - '0'; // 删去多乘的部分
            cur2 += cur * (b[0] - '0');
            ans.push_back((cur2 % 10) + '0');
            cur2 /= 10;
        }
        while(ans.size() > 1 && ans.back() == '0') ans.pop_back();
        reverse(ans.begin(),ans.end());
        cout << ans << '\n';
    }
    return 0;
}

水灵灵的小学弟

题目

校草杜宏言和他亲爱的小学弟段辉映在玩一个取石子益智小游戏。

游戏规则如下,有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子(取走的数量都是整数)。
游戏规定,每次有两种不同的取法:
∙ \quad \bullet 可以在任意的一堆中取走任意多的石子;
∙ \quad \bullet 可以在两堆中同时取走相同数量的石子。
最后把石子全部取完者为胜者。
现在给出初始的两堆石子的数目,如果轮到杜宏言先取,假设双方都采取最好的策略,问最后谁是胜者。

输入
第一行输入一个 T T T,表示有 T T T 组数据。 ( 1 ≤ T ≤ 10000 ) (1 \leq T \leq 10000) (1T10000)

接下来 T T T 行,其中每一行包含两个整数 a a a b b b,表示两堆石子的数目, ( 1 ≤ a , b ≤ 1 0 9 ) (1 \leq a,b \leq 10^9) (1a,b109)

输出
输出对应也有 T T T 行,输出赢者名字每个字首字母,要求大写。例如“原神”,输出“YS”(不带引号)。

AC代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
    int a,b;cin>>a>>b;
    cout<<"DHY\n"; // 易发现 ,杜宏言和段辉映 的名字每个字首字母相同
}
signed main()
{
    int t;cin>>t;
    while(t--)    solve();
    return 0;
}

狼狼的备忘录

题目

圈圈:代打王者, 1 r 1r 1r 一局, 3 r 3r 3r 两局, 5 r 5r 5r 三局,不保证胜率,诚信经营

y q yq yq :圈,我赚的第一块是小寒冰的~

静静:鸢还不给我抽到张邈!!!

狼狼:瓦,启…

玉玉:长相思长相思长相思

以上是广告招租位,和本题无关。
由于狼狼是一个喜欢看星座的小女孩,为此她写了几本备忘录来记录集训队成员的星座信息。(桃白白说过,经常看星座相关的信息可以提高 c o d e f o e c e s codefoeces codefoeces 分数。多读书多看报,少吃零食多 c o d e f o r c e s !!! codeforces!!! codeforces!!!

狼狼决定整理这几本备忘录里有关集训队成员的星座信息,每本备忘录都记录着一个成员的一条或多条星座信息。包含 n n n 本备忘录:每本备忘录都由一个名字 i d id id 开头代表某个集训队成员名字,然后是一个记录的条目数代表狼狼在该备忘录中记录该成员的信息条数 o p op op ,最后是 o p op op 条星座信息本身。同一本备忘录中可能记录了多个相同的星座信息,不同的备忘录可能记录同一个人的多条信息。

狼狼认为整理这些备忘录信息应该遵循一下规则:

A:同一个成员的星座信息 x x x 是星座信息 y y y 的后缀,那么星座信息 x x x 会没有星座信息 y y y 完整,从而应该只保留星座信息 y y y ,删除星座信息 x x x

B:同一个成员的星座信息可能以相同格式出现多次,那么只保留该信息一次。

注意:有可能两个不同的成员有着相同的星座信息,这是合法的。

现在狼狼现在要跟圈圈静静 y q yq yq 玉玉前往瓦的训练场,请你按照规则 A A A ,规则 B B B 帮助狼狼整理她的备忘录,并且将这些备忘录信息按照字典序打印出来。

输入
包含整数 n ( 1 < = n < = 20 ) n(1<= n <= 20) n1<=n<=20) - 狼狼的备忘录本数

接下来的 n n n 行是按照语句中的格式对成员的星座信息进行描述。

成员名字是长度不超过10的非空字符串,他们仅由小写英文字母组成。条目数是一个不少于1,不超过10的整数。星座信息是长度不超过10的非空字符串,仅由数字组成。

输出
打印有关狼狼备忘录中集训队成员们的星座信息。
第一行输出 m m m 表示在狼狼备忘录中找到的成员的数量。
以下 m m m 行必须包含以下格式:“成员名字 条目数信息 信息”,每条记录必须包含当前成员的所有星座信息。
输出时成员名字字典序小的先输出,每个成员的星座信息中字典序小的先输出,星座信息中前导零也要输出。

解题思路

注意判断后缀

AC代码

#include<bits/stdc++.h>
using namespace std;
map<string,vector<string> > mp; // 根据名字,储存信息
map<string ,int > v; 
vector<string >name; // 储存出现的名字
string s,t;
int main()
{
    int n;cin>>n;
    while(n--)
    {
        s.clear();cin>>s;
        if(v[s]==0)
        {
            v[s]=1;
            name.push_back(s);
        }
        int op;cin>>op;
        while(op--)
        {
            t.clear();cin>>t;
            mp[s].push_back(t);
        }
        sort(mp[s].begin(),mp[s].end()); // 排序
        mp[s].erase(unique(mp[s].begin(),mp[s].end()),mp[s].end()); // 去重
    }
    sort(name.begin(),name.end());
    vector<string > ans;
    cout<<name.size()<<'\n';
    for(int i=0;i<name.size();i++)
    {
        cout<<name[i]<<' ';
        ans.clear();
        for(auto a : mp[name[i]])
        {
            int f=0;
            for(auto b : mp[name[i]])
            {
                if(a==b)continue;
                if(a.size()<b.size()&&b.substr(b.size()-a.size())==a) // 排除后缀
                {
                    f=1;
                    break;
                }
            }
            if(f==0)ans.push_back(a);
        }
        cout<<ans.size()<<' ';
        for(auto z : ans)cout<<z<<' ';
        cout<<'\n';
    }
    return 0;
}

重生之zbk要拿回属于他的一切

题目

曾几何时,光芒万丈,一人之下,万人之上。可叹今日,zbk倒在血泊之中,兄弟联手他的未婚妻背刺了他,他的好兄弟小川夺走了属于他的一切,包括他的未婚妻。他如此爱他的未婚妻,为救他身负重伤,才给了小川可乘之机,但现在回想起来,自己也不过是一只爱情的添狗罢了。

濒死之际,恍惚中,zbk听到了一声呢喃,“如果我再给你一次机会,你又会做出怎样的抉择呢?” “你。。。你究竟是何方神圣?” “只是一直普通平凡恰恰好路过的禹longlong罢了。”

就这样在禹longlong的帮助下,zbk成功的回到了一年之前。这一世,zbk要拿回属于他的一切。但在此之前,他需要在人群中分辨出他复仇的对象是否在其中,因为zbk是个死舔狗,不忍心对未婚妻下手,因此他只需要找到小川就好了。对此,他发动了他的大编程术。

给定一个长度为n的字符串S,S全由小写字母组成,当这个字符串中存在子串“chuan”(不加引号)时,说明小川就在其中,小川可能有很多个,请输出在该字符串 S S S中小川的数量。

输入
1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105
然后输入一个长度为n且全为小写字母组成的字符串s。

输出
输出一个非负整数,表示给定字符串中的子串chuan的数量。

AC代码

#include<bits/stdc++.h>
using namespace std;
int  main()
{
    int n;
    cin>>n;
    string s;
    cin>>s;
    string tt="chuan";
    int ans=0,d=0;
    while(s.find(tt,d)!=s.npos) //寻找是否存在
    {
        d+=5;
        ans++;
    }
    cout<<ans;
    return 0;
}

这是签到

题目

毛毛看到Sakura出的计算题之后发现太难了就稍微改了一下。然后转头就让冰冰来做这道题。

题目要求冰冰得到一个 n × m n \times m n×m 的行列式。有些行列式可能无法直接计算,但可以做一个操作:在行或列补充全为 0 0 0 的一行或一列,使其变为可计算的。不过最多只能扩充成 m a x ( n , m ) × m a x ( n , m ) max(n,m) \times max(n,m) max(n,m)×max(n,m) 的行列式。要想拿满分,需计算所有可计算行列式中从 ( 1 , 1 ) (1,1) (1,1) 位置构成的最小值

输入
第一行给出两个整数n,m。

接下来的n行,每行给出m个整数。

1 ≤ n , m ≤ 5 , ∣ a i j ∣ ≤ 10 1\le n,m\le5,|a_{ij}|\le10 1n,m5,aij10

输出
输出一个整数,所有构成可计算行列式的最小值。

AC代码

// 大型模拟
#include<bits/stdc++.h>
using namespace std;
#define int long long
int mp[10][10];
signed main()
{
    memset(mp,0,sizeof(mp));
    int n,m;cin>>n>>m;
    int mi=100;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mp[i][j];
            mi=min(mi,mp[i][j]);
        }
    }
    int ma=max(n,m);
    int ans=mi;
    int x=1,y=1;
    int t=0;
    if(ma>=2)
    {
    	t=0;
    	t+=(mp[x][y]*mp[x+1][y+1]-mp[x][y+1]*mp[x+1][y]);
    	ans=min(t,ans);
	}
    if(ma>=3)
    {
    	t=0;
    	t+=(mp[x][y]*mp[x+1][y+1]*mp[x+2][y+2]-mp[x][y+2]*mp[x+1][y+1]*mp[x+2][y]);
    	t+=(mp[x][y+1]*mp[x+1][y+2]*mp[x+2][y]-mp[x][y]*mp[x+1][y+2]*mp[x+2][y+1]);
    	t+=(mp[x][y+2]*mp[x+1][y]*mp[x+2][y+1]-mp[x][y+1]*mp[x+1][y]*mp[x+2][y+2]);
    	ans=min(ans,t);
	}
    
	if(ma>=4)
	{
		t=0;
    	t+=(mp[x][y]*mp[x+1][y+1]*mp[x+2][y+2]*mp[x+3][y+3]-mp[x][y+3]*mp[x+1][y+2]*mp[x+2][y+1]*mp[x+3][y]);
    	t+=(mp[x][y+1]*mp[x+1][y+2]*mp[x+2][y+3]*mp[x+3][y]-mp[x][y]*mp[x+1][y+3]*mp[x+2][y+2]*mp[x+3][y+1]);
    	t+=(mp[x][y+2]*mp[x+1][y+3]*mp[x+2][y]*mp[x+3][y+1]-mp[x][y+1]*mp[x+1][y]*mp[x+2][y+3]*mp[x+3][y+2]);
    	t+=(mp[x][y+3]*mp[x+1][y]*mp[x+2][y+1]*mp[x+3][y+2]-mp[x][y+2]*mp[x+1][y+1]*mp[x+2][y]*mp[x+3][y+3]);
    	ans=min(ans,t);
	}
    
    if(ma==5)
    {
    	t=0;
    	t+=(mp[x][y]*mp[x+1][y+1]*mp[x+2][y+2]*mp[x+3][y+3]*mp[x+4][y+4]-mp[x][y+4]*mp[x+1][y+3]*mp[x+2][y+2]*mp[x+3][y+1]*mp[x+4][y]);
    	
    	t+=(mp[x][y+1]*mp[x+1][y+2]*mp[x+2][y+3]*mp[x+3][y+4]*mp[x+4][y]-mp[x][y]*mp[x+1][y+4]*mp[x+2][y+3]*mp[x+3][y+2]*mp[x+4][y+1]);
    	
		t+=(mp[x][y+2]*mp[x+1][y+3]*mp[x+2][y+4]*mp[x+3][y]*mp[x+4][y+1]-mp[x][y+1]*mp[x+1][y]*mp[x+2][y+4]*mp[x+3][y+3]*mp[x+4][y+2]);
    	
		t+=(mp[x][y+3]*mp[x+1][y+4]*mp[x+2][y]*mp[x+3][y+1]*mp[x+4][y+2]-mp[x][y+2]*mp[x+1][y+1]*mp[x+2][y]*mp[x+3][y+4]*mp[x+4][y+3]);
    	
		t+=(mp[x][y+4]*mp[x+1][y]*mp[x+2][y+1]*mp[x+3][y+2]*mp[x+4][y+3]-mp[x][y+3]*mp[x+1][y+2]*mp[x+2][y+1]*mp[x+3][y]*mp[x+4][y+4]);
    	ans=min(ans,t);
	}
    cout<<ans;
    return 0;
}
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值