第一题:字符串拼接
键盘输入两个字符串,将这两个字符串进行拼接后输出。
输入描述:
键盘输入两个字符串
输出描述:
输出两个字符串拼接后的结果
示例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 型字符串满足以下条件:
- 字符串长度为 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;
}
文章出处登录后可见!