第六届传智杯c++B组

第一题:字符串拼接

键盘输入两个字符串,将这两个字符串进行拼接后输出。

输入描述:

键盘输入两个字符串

输出描述:

输出两个字符串拼接后的结果

示例1

输入

hello
nihao

输出

hellonihao

思路:

可以用vector来存,逐个输出

ac代码:

#include<bits/stdc++.h>

using namespace std;

vector<string> st;
int main()
{
	int n;
	cin>>n;
	
	while(n--)
	{
		string str;
		cin>>str;
		st.push_back(str);
	}
	
	for(auto t:st)cout<<t;
	
	return 0;
}

第二题:最小差值

问题描述

  给定 n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。

输入格式

  输入第一行包含一个整数 n。
  第二行包含 n个正整数,相邻整数之间使用一个空格分隔。

输出格式

  输出一个整数,表示答案。

样例输入

5
1 5 4 8 20

样例输出

1

样例说明

  相差最小的两个数是5和4,它们之间的差值是1。

样例输入

5
9 3 6 1 3

样例输出

0

样例说明

  有两个相同的数3,它们之间的差值是0.

数据规模和约定

  对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。

思路:先排序一次,再比从头开始较相邻的两个元素值之差,寻求最小值

AC代码:

#include<bits/stdc++.h>

using namespace std;
const int N=100010;
int q[N];

int main()
{
	int n;
	cin>>n;
	
	for(int i=1;i<=n;i++)
	{
		cin>>q[i];
	}
	
	sort(q+1,q+n+1);
	
	int res=1e7;
	for(int i=2;i<=n;i++)
	{
		if(q[i]-q[i-1]<res)
		{
			res=q[i]-q[i-1];
		}
	}
	
	cout<<res<<endl;
	
	return 0;
}

第三题:红色和紫色
 

题目描述

漫长的生命总是无聊的。这天,小红和紫准备玩一个染色游戏。
她们拿出了一个有 n∗m n*m\ n∗m 个格子的网格,每个格子只能被染成红色或紫色。每个人可以任意选择一个格子染成红色和紫色,两人轮流进行染色。
她们约定,不能有两个相邻的格子有相同的颜色。最后无法进行染色的人判输。
小红先手进行染色。小红想知道,双方都采用最优策略的情况下,她能否取得胜利?

输入描述:

两个正整数n n\ n 和 m m\ m ,用空格隔开。

(1≤n,m≤109) (1\leq n, m \leq 10^9)\ (1≤n,m≤109) 

输出描述:

如果小红获胜,则输出一个字符串"akai"
如果紫获胜,则输出一个字符串"yukari"

示例1

输入

1 1

输出

akai

思路:博弈论,找规律题,从题目中可以发现,小红先手,当格子的长宽之积如果为奇数,则小红获胜,反之则紫色获胜。

注:该题要开long long ,否则会爆int

AC代码:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    long long n,m;
    cin>>n>>m;
    
    if(n*m%2==0)
    {
        cout<<"yukari"<<endl;
    }
    else{
        cout<<"akai"<<endl;
    }
    return 0;
}

第四题:add

描述

leafee 最近爱上了 abb 型语句,比如“叠词词”、“恶心心”

leafee 拿到了一个只含有小写字母的字符串,她想知道有多少个 “abb” 型的子序列?
定义: abb 型字符串满足以下条件:

  1. 字符串长度为 3 。
  2. 字符串后两位相同。
  3. 字符串前两位不同。

输入描述:

第一行一个正整数 n

第二行一个长度为 n 的字符串(只包含小写字母)

1≤n≤105

输出描述:

“abb” 型的子序列个数。

示例1

输入:

6
abcbcc

输出:

8

说明:

共有1个abb,3个acc,4个bcc

示例2

输入:

4
abbb

输出:

3

思路:先用两个map分别存放每一个字母分别出现了多少次,和在此之前该字母已经出现了多少次,从第一个字母开始枚举,由该字母组成满足add式的个数为 前面与该字母不一样的字母个数乘以后面出现该字母的个数,最终求和。

#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;

const int N=100010;
unordered_map<char, int> st;//在字符串中该字符出现了多少次
unordered_map<char, int> st1; //在次之前出现了多少次

int main()
{
    int n;
    cin>>n;
    long long  sum=0;//开long long答案会爆int 
    string s;
    cin>>s;

    for(auto t:s)st[t]++;

    for(int i=0;i<n;i++)
    {
        char c=s[i];
        st[c]--;
        st1[c]++;
        if(st[c]>0)
        {
            sum+=(st[c]*(i+1-st1[c]));
        }

    }
    cout<<sum<<endl;

    return 0;

    



    
}

第五题:kotorti和素因子

题目描述

kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是,kotori有强迫症,她不允许两个不同的正整数取出相同的素因子。

她想知道,最终所有取出的数的和的最小值是多少?

注:若 a mod k==0,则称 k 是 a 的因子。若一个数有且仅有两个因子,则称其是素数。显然1只有一个因子,不是素数。

输入描述:

第一行一个正整数 n ,代表kotori拿到正整数的个数。
第二行共有 n 个数 ai​,表示每个正整数的值。
保证不存在两个相等的正整数。
1≤n≤10
2≤ai≤1000

输入描述:

一个正整数,代表取出的素因子之和的最小值。若不存在合法的取法,则输出-1。

示例1

输入

4
12 15 28 22

输出

17

说明

分别取3,5,7,2,可保证取出的数之和最小  

思路:筛质数+dfs

                要保证每一个数取出的质数之和最小,因为n的范围较小,可以用dfs把全部的情况枚举出来,分别对每一种情况求最小值进行比较,最终得到最小值。

#include<bits/stdc++.h>
using namespace std;

const int N=1000;
int primes[N];
int cnt=0;
bool st[N];
int q[N];
int sum=1e9;
int n;
set<int> s;//用set来存放已经取出来的质数

//线性筛
// void get_primes(int n)
// {
//     for (int i = 2; i <= n; i ++ )
//     {
//         if (!st[i]) primes[cnt ++ ] = i;
//         for (int j = 0; primes[j] <= n / i; j ++ )
//         {
//             st[primes[j] * i] = true;
//             if (i % primes[j] == 0) break;
//         }
//     }
// }

bool primes1(int u)
{
    if(u<2)return false;
    else
    {
        for(int i=2;i<=u/i;i++)
        {
            if(u%i==0)return false;
        }
    }
    return true;
}

bool fun(int u)
{
    for(int i=0;i<168;i++)
    {
        if(primes[i]==u)return false;
    }
    return true;
}

void dfs(int x,int y,set<int> s)
{
    //如果x==n,则证明有1条搜索路径已经走完,则进行比较最小值
    if(x==n)
    {
        sum=min(sum,y);
        return ;
    }
    
    for(int i=2;i<=q[x];i++)
    {
        if(q[x]%i==0 && !s.count(i) && primes1(i))
        {
            s.insert(i);
            dfs(x+1,y+i,s);
            s.erase(i);
        }
    }
}

int main()
{
    cin>>n;
    
    
    for(int i=0;i<n;i++)
    {
        cin>>q[i];
    }
    //参数分别为 第几个数,当前的最优解,ser集合
    dfs(0,0,s);
    
    if(sum!=1e9)cout<<sum<<endl;
    else cout<<"-1"<<endl;
    
    return 0;
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年12月19日
下一篇 2023年12月19日

相关推荐