第四届“传智杯”全国大学生IT技能大赛(决赛B组)

60 篇文章 0 订阅

A. 小智的疑惑

题目描述

传智专修学院给了小智一个仅包含小写字母的字符串 s,他想知道,里面出现了多少次子串 chuanzhi 呢。
我们称一个字符串 t 是 s 的子串,当且仅当将 s 的开头若干个(可以为 0 个)连续字符和结尾若干个(可以为 0 个)连续字符删去后,剩下的字符串和 t 相同。例如,我们称 ab 是 abc 的子串,但 ac 不是 abc 的子串。

解题思路: 直接开python,快速方便。

print (input().count('chuanzhi'))

B. 三元组

题目描述
给定一个长度为 n 的数列 a,对于一个有序整数三元组 (i,j,k),若其满足 1≤i≤j≤k≤n 并且 ai+aj=ak​,则我们称这个三元组是「传智的」。
现在请你计算,有多少有序整数三元组是传智的。

解题思路: 暴力循环。

#include<bits/stdc++.h>
using namespace std;
int a[105],n,ans,t;
int main()
{
	cin>>t;
	while(t--)
	{
		ans=0;
		cin>>n;
		for(int i=0;i<n;i++)cin>>a[i];
		for(int i=0;i<n;i++)
		{
			for(int j=i;j<n;j++)
			{
				for(int k=j;k<n;k++)
				{
					if(a[i]+a[j]==a[k])ans++;
				}
			}
		}
		cout<<ans<<endl;
	}
	return 0;
} 

C. 排排队

题目描述
在传智专修学院中,每个人都有一个身高 ai​,并且只有相邻的两个人可以交换位置。小智带领的队伍有 n 个人,他现在要给大家排队形。

给定一个长度为 n 的序列 b,一个队形被认为美观,当且仅当对于所有的 i=1,2,3,…n,ai=bi。小智想知道,他能否让大家的队形变得美观,并且交换相邻两个人的次数不超过 n^2 次。这个问题把小智难住了,请你帮他来解决这个问题,如果存在合法的交换方案,输出 YES,并给出一组方案;否则,输出 NO。

解题思路: 重新对a进行排序然后交换位置,假设a={1,2,2,3},b={3,2,2,1},给多一个数组对当前的a确认位置num={4,2,3,1}代表最终要去到的位置,对num数字进行冒泡排序交换i和j的值最后变成{1,2,3,4}就可以了。

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int t,n,a[N],b[N],num[N],flag;
int main()
{
    cin>>t;
    while(t--)
    {
    	flag=0;
        memset(num,0,sizeof num);
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)cin>>b[i];
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(a[j]==b[i]&&num[j]==0)//确保每个都有对应
                {
                    num[j]=i;
                    break;
                }
            }
        }
        for(int i=1;i<=n;i++)if(num[i]==0)flag=1;
        if(flag)//数量对不上直接输出no
        {
            cout<<"NO"<<endl;
            continue;
        }
        cout<<"YES"<<endl;
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<n;j++)
            {
                if(num[j]>num[j+1])
                {
                    cout<<j<<" "<<j+1<<endl;
                    swap(num[j],num[j+1]);
                }
            }
        }
        cout<<"0 0"<<endl;
    }
   return 0;
}

D. 背单词的小智

题目描述
大概意思就是,n个单词分成k个区间,确保最大的区间价值最小。
对于样例二,分成两个区间,代价分别是1+4+9=14和16,最大价值为16是最优解。
解题思路: 二分最大值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,a[100005],x;
bool pd(ll num)
{
	ll ans=0,sum=0;
	for(int i=1;i<=n;i++)
	{
		sum+=a[i];
		if(sum+a[i+1]>num)sum=0,ans++;
	}
	if(sum>0)ans++;
	if(ans>k)return false;
	return true;
}
int main()
{
	ll l=1,r=1e18;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>x,a[i]=x*x;
		l=max(l,a[i]);
	}
	while(l<r)
	{
		ll mid=l+r>>1;
		if(pd(mid))r=mid;
		else l=mid+1;
	}
	cout<<l<<endl;
	return 0;
}

E. 游戏

写不出来555

F1. 生活在树上(easy version)

题目描述
给出n个节点和m个查询,查询两个城市之间的权值异或和是否等于k。
题目确保了城市是一棵最小生成树。

解题思路: 首先我们要知道异或的性质
交换律: a ^ b ^ c = a ^ c ^ b
任何数于0异或为任何数 :0 ^ n = n
相同的数异或为0:n ^ n = 0
接着看样例一的图
在这里插入图片描述
城市1到城市4的其中一种异或就是1-3异或4-3,结果就是8 ^ 2 ^ 6 ^ 6,相当于城市1直接异或到城市4,也就是8 ^ 2,所以我们只需要判断最短路径上的异或是否等于k然后输出就好了。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=500005;
int n,m,a[N],x,y,nex[N*2],en[N*2],ans;
ull w[N*2],num[N],val;
bool pd[N];
void add(int x,int y,ull val)
{
	en[ans]=y;
	w[ans]=val;
	nex[ans]=a[x];
	a[x]=ans++;
}
void dfs(int cnt)
{
	for(int i=a[cnt];i!=-1;i=nex[i])
	{
		int j=en[i];
		if(!pd[j])
		{
			num[j]=num[cnt]^w[i];
			pd[j]=1;
			dfs(j);
			pd[j]=0;
		}
	}
}
int main()
{
	std::ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)a[i]=-1;
    for(int i=1;i<n;i++)
	{
		cin>>x>>y>>val;
		add(x,y,val);
		add(y,x,val);
	}
	pd[1]=1;
	for(int i=a[1];i!=-1;i=nex[i])
	{
		num[en[i]]=w[i];
		dfs(en[i]);
	}
	while(m--)
	{
		ull u,v;
		cin>>u>>v>>val;
		if(n==1)
		{
			cout<<"NO"<<endl;
			continue;
		}
		if(u!=1&&v!=1)
		{
			if((num[u]^num[v])==val)cout<<"YES"<<endl;
			else cout<<"NO"<<endl;
		}
		else
		{
			if(u==1)
			{
				if(num[v]==val)cout<<"YES"<<endl;
				else cout<<"NO"<<endl;
			}
			else
			{
				if(num[u]==val)cout<<"YES"<<endl;
				else cout<<"NO"<<endl;
			}
		}
	}
    return 0;
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
第六届传智杯B初赛是传智播客举办的一次IT技术竞赛的初赛阶段,旨在选拔出各高校优秀的程序设计人才。该比赛中,参赛者将面临多道编程题目,通过编写程序解决问题来展示他们的技术水平和创新能力。 在初赛中,参赛者需要在规定的时间内完成多道程序设计题目。这些题目可能涉及数据结构、算法、网络通信等方面的知识,要求参赛者具备扎实的编程基础和解决实际问题的能力。 参赛者需要在规定的时间内完成编程题目,并提交给评委进行评分。评委会根据答案的正确性、效率、代码的可读性等方面对参赛者的作品进行综合评判。最终,得分高的参赛者将进入下一轮比赛。 第六届传智杯B初赛的目的是为了选拔出具备优秀编程能力的学生,为他们提供一个展示才华、学习交流的平台。参赛者不仅可以通过比赛锻炼自己的编程技巧,还可以结识其他优秀的参赛者,相互学习、切磋技艺。 在比赛过程中,参赛者还可以通过与其他选手交流,了解各种不同的编程思路和解题方法,不断提高自己的编程水平。同时,参赛者还有机会与业界的专家学者进行交流,了解最新的技术动态和发展趋势。 总之,第六届传智杯B初赛是一次很有意义的编程竞赛,为各大高校的IT人才选拔提供了一次难得的机会。通过比赛,参赛者可以展现自己的才华,提升技术水平,同时也可以与其他优秀选手进行交流,共同进步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值