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

A 国际旅行Ⅰ

题目描述
很久很久以前,有 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 ,表示小龙他的问题。

思路

:第二行输入的数组排序,从小到大对应第k个;

代码
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n,m,q;
	cin>>n>>m>>q;
	int a[1001];
	for(int i=0;i<n;i++)
		cin>>a[i];
	int u,v;
	while(m--)
		cin>>u>>v;
	int k;
	while(q--)
	{
		cin>>k;
		sort(a,a+n);
		cout<<a[k-1]<<endl;//在这从零开始所以-1;
	}
	return 0;	
}

D 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同学写不出题太痛苦了,于是请求你帮帮他。

先上错误代码,比赛时没过,后来看到只能国83%;

#include<iostream>
#include<string>
#include<algorithm>
const int N=1e6+5;
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
        int a[N],b[N],c[N]={0};
		string s1,s2;
		cin>>s1>>s2;
		int l1=s1.size(),l2=s2.size();
		for(int i=0;i<l1;i++)
			a[l1-i-1]=s1[i]-'0';
		for(int i=0;i<l2;i++)
			b[l2-i-1]=s2[i]-'0';
		for(int i=0;i<l1;i++)
			for(int j=0;j<l2;j++)
				c[i+j]+=a[i]*b[j];
		int l=l1+l2;
		for(int i=0;i<l;i++)
			if(c[i]>9)
			{
				c[i+1]+=c[i]/10;
				c[i]%=10;
			} 
		while(c[l]>9)
		{
			c[l+1]+=c[l]/10;
			c[l]%=10;
			l++;
		}
		while(c[l-1]==0&&l>1)
			l--;
		for(int i=l-1;i>=0;i--)
		cout<<c[i];
        cout<<'\n';
	}
	return 0;
}
思路:

在于字符串b每位数字都相等,相当于字符串a每位与b每一位都是1 相乘,最后乘以k

正确代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long 
signed main()
{
	int t;
	cin>>t;
	while(t--)
	{
		string a,b;
	cin>>a>>b;
	reverse(a.begin(),a.end());//末尾开始
	string ans;
	int sum=0,sum1=0,k=b[0]-'0';//k表示每一位是几
	for(int i=0;i<a.size()+b.size();i++)
	{
		if(i<a.size())
			sum+=a[i]-'0';//以数字形式
		if(i>=b.size())
			sum-=(a[i-b.size()]-'0');
		sum1+=sum*k;//每一位乘以k
		ans.push_back(sum1%10+'0');//各个位数先存进去
		sum1/=10;
	}
	while(ans.back()=='0'&&ans.size()>1)//去除头部0;
		ans.pop_back();
	reverse(ans.begin(),ans.end());
	cout<<ans<<"\n";
	}
	return 0;
}

F 水灵灵的小学弟

题目描述

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

游戏规则如下,有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子(取走的数量都是整数)。
游戏规定,每次有两种不同的取法:
∙ \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)

思路

:对于这道题而言,不管谁赢输出一样;

直接代码
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
signed main()
{
	int t;
	cin>>t;
	while(t--)
	cout<<"DHY"<<'\n';
	return 0;
}

H 狼狼的备忘录

题目描述
由于狼狼是一个喜欢看星座的小女孩,为此她写了几本备忘录来记录集训队成员的星座信息。(桃白白说过,经常看星座相关的信息可以提高 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 帮助狼狼整理她的备忘录,并且将这些备忘录信息按照字典序打印出来。

思路:

比赛的时候想的后缀不是很对,导致题目没看懂,后来发现就是比如789,89,9,89和9都是789的后缀但是8,7不是只要找到后缀就删除就行

代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e6 + 10;
map<string,set<string>>mp;
signed main() 
{
    int n;
	cin>>n;
    for(int i=1;i<=n;i++)
    {
        string s;
		cin>>s;
        int t;
		cin>>t;
        for(int i=1;i<=t;i++)
        {
            string a;cin>>a;
            mp[s].insert(a);
        }
    }
    cout<<mp.size()<<endl;
    for(auto [k,v]:mp)
    {
        vector<string>q;
        for(string x:v)
        {
            int f=1;
            for(string y:v)
                if(x!=y&&x.size()<y.size()&&x==y.substr(y.size()-x.size()))
                    f=0;        
            if(f)q.push_back(x);
        }
        cout<<k<<" "<<q.size();
        for(string b:q)
			cout<<" "<<b;
        cout<<endl;
    }
}

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

题目描述

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

思路

:严格查找"chuan"就行,必须字母紧挨着顺序和"chuan"一样;

代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
    int n;
    cin>>n;
    string s;
    cin >> s;
    int sum = 0;
    int f=0;
    for(int i = 0; i < n; i++)
    {
        if(s[i]=='c'&&s[i+1]=='h')f=1;
        if(s[i]=='h'&&f==1&&s[i+1]=='u'&&s[i-1]=='c')f=2;
        if(s[i]=='u'&&f==2&&s[i+1]=='a'&&s[i-1]=='h')f=3;
        if(s[i]=='a'&&f==3&&s[i+1]=='n'&&s[i-1]=='u')f=4;
        if(s[i]=='n'&&f==4&&s[i-1]=='a')f=5;
            if(f==5)sum++;
    }
    cout << sum << endl;
    return 0;
}

J 这是签到

题目描述

题目要求冰冰得到一个 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) 位置构成的最小值

思路

:因为最大5*5,所以直接所有值求一下就行

代码
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
signed main() {
    int n, m;
    cin >> n >> m;
    int a[5][5] = {0};  
    for (int i = 0; i < n; i++) 
        for (int j = 0; j < m; j++) 
            cin >> a[i][j];
    int maxx = a[0][0];
    if (m > 1 && n > 1) 
	{ 
        int sum2 = a[0][0] * a[1][1] - a[1][0] * a[0][1];
        maxx = min(maxx, sum2);
    }
    if (m > 2 && n > 2) 
	{  
        int sum3 = a[0][0] * a[1][1] * a[2][2]
                 + a[1][0] * a[2][1] * a[0][2]
                 + a[2][0] * a[0][1] * a[1][2]
                 - a[2][0] * a[1][1] * a[0][2]
                 - a[1][0] * a[0][1] * a[2][2]
                 - a[0][0] * a[2][1] * a[1][2];
        maxx = min(maxx, sum3);
    }
    if (m > 3 && n > 3) 
	{  
        int sum4 = a[0][0] * a[1][1] * a[2][2] * a[3][3]
                 + a[1][0] * a[2][1] * a[3][2] * a[0][3]
                 + a[2][0] * a[3][1] * a[0][2] * a[1][3]
                 + a[3][0] * a[0][1] * a[1][2] * a[2][3]
                 - a[3][0] * a[2][1] * a[1][2] * a[0][3]
                 - a[2][0] * a[1][1] * a[0][2] * a[3][3]
                 - a[1][0] * a[0][1] * a[3][2] * a[2][3]
                 - a[0][0] * a[3][1] * a[2][2] * a[1][3];
        maxx = min(maxx, sum4);
    }
    if (m > 4 && n > 4) 
	{
        int sum5 = a[0][0] * a[1][1] * a[2][2] * a[3][3] * a[4][4]
                 + a[1][0] * a[2][1] * a[3][2] * a[4][3] * a[0][4]
                 + a[2][0] * a[3][1] * a[4][2] * a[0][3] * a[1][4]
                 + a[3][0] * a[4][1] * a[0][2] * a[1][3] * a[2][4]
                 + a[4][0] * a[0][1] * a[1][2] * a[2][3] * a[3][4]
                 - a[4][0] * a[3][1] * a[2][2] * a[1][3] * a[0][4]
                 - a[3][0] * a[2][1] * a[1][2] * a[0][3] * a[4][4]
                 - a[2][0] * a[1][1] * a[0][2] * a[4][3] * a[3][4]
                 - a[1][0] * a[0][1] * a[4][2] * a[3][3] * a[2][4]
                 - a[0][0] * a[4][1] * a[3][2] * a[2][3] * a[1][4];
        maxx = min(maxx, sum5);
    }
	if(n!=m&&maxx>0)//因为n,m不相等的时候,补充零,最小值一定小于等于0
		maxx=0; 
    cout << maxx << endl;
    return 0;
}
  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值