第五届太原理工大学程序设计竞赛新生赛
A-饿饿饭饭
901星球的魔怔人每天会且只会说一个词语:饿饿饭饭
告诉你一个魔怔人的名字,请问他今天说了什么?
输入描述:
输入一行一个字符串,由字母组成,长度不超过20,表示魔怔人的名字。
输出描述:
输出魔怔人今天说了什么,格式如 xx:eeff
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
cout<<s<<":"<<"eeff";
return 0;
}
B-扣点点
题目描述
Hammer 喜欢很喜欢山西麻将扣点点,可是他理牌理不明白,请你帮他按条 (B) 、万 © 、筒 (D) 的顺序理一下牌。
即如果花色不同,条在左,万在中间,筒在右边;如果花色相同,点数小的在左边。
输入描述:
输入共两行。
第一行输入一个正整数 n,(1\le n\le 14)n(1≤n≤14) ,表示Hammer手上的牌数。
第二行输入 nn 个长度为2的字符串,格式如 XY
,X
代表点数,Y
代表花色。保证点数是 1~9 范围内的整数,花色是 B
C
D
三种之一。
输出描述:
输出一行 nn 个长度为2的字符串,表示整理后的牌序。
示例1
输入
7
1D 2B 3C 4D 5C 6B 7D
输出
2B 6B 3C 5C 1D 4D 7D
示例2
输入
14
2C 7B 7D 2C 2C 7D 3D 4C 9B 2D 5C 1D 8B 6C
输出
7B 8B 9B 2C 2C 2C 4C 5C 6C 1D 2D 3D 7D 7D
#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b)
{
if(a[1]!=b[1]) return a[1]<b[1];//字符排序
else return a[0]<b[0];//数字排序
}
int main()
{
int n;cin>>n;
vector<string>a;
while(n--)
{
string s;cin>>s;
a.push_back(s);
}
sort(a.begin(),a.end(),cmp);
for(auto str:a)//str遍历动态数组a,从第一个输出直到最后一个
cout<<str<<' ';
}
C-String problem
题目描述
在 Hammer 水群时无意了解到了一个新的字符串问题:
Hammer 花了一天时间,明白了这个问题是指:至少修改多少字符,才能使 3 个长度为 k 的字符串完全相同。
请你帮 Hammer 解决这个问题。
输入描述:
第一行输入一个正整数 k,( 1 \le k\le 10^5)k(1≤k≤105 ) ,表示字符串长度。
接下来三行,每行输入一个长度为 kk 的字符串,仅由小写字母组成。
输出描述:
输出一行一个整数,表示答案。
示例1
输入
2
ab
ab
ba
输出
2
说明
可以将第三个字符串修改为 “ab” ,只需修改 2 个字符。
示例2
输入
3
abc
cbb
aba
输出
3
说明
将所有字符串修改为 “abb” ,需要修改 3 个字符。也可以将所有字符串修改为 “abc” ,同样需要修改 3 个字符。
示例3
输入
1
z
z
z
输出
0
说明
无需进行修改,三个字符串就已经相同。
/*判断每一个字符串的每一个对应的字符是否相等
若不相等则计数all++,若对应的三个字符都不相同,则需修改两个字符,all+2*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int n;cin>>n;
string s,ss,sss;cin>>s>>ss>>sss;
int all=0;
for(int i=0;i<n;i++)
{
if(s[i]!=ss[i]&&(s[i]==sss[i]||sss[i]==ss[i]))all++;
else if(s[i]!=sss[i]&&(s[i]==ss[i]||ss[i]==sss[i]))all++;
else if(sss[i]!=ss[i]&&(s[i]==ss[i]||sss[i]==s[i]))all++;
else if(sss[i]!=ss[i]&&sss[i]!=s[i]&&s[i]!=ss[i])all+=2;
}
cout<<all;
return 0;
}
D-数豆豆
题目描述
Forest 和 Gold Rong 喜欢数豆豆,两个人打算从一个数 nn 拆成两个数,比如 12234 可以拆成(134,22),(1,2234)都是合法的,但是(1122,34)就是不合法的。
两个人都希望自己的豆豆数尽可能的多,但是显然一个人多拿一个数字,另一个人就少拿一个数字。所以他们两个人制定一个规则:两个人轮流拿,每个人每次都只能挑走一个数字。Forest 先拿。
假设两个人都足够聪明,问最后两个人的豆豆数分别是多少。
输入描述:
输入一行一个整数 n,(10\le n\lt 10^{100000})n(10≤n<10 ^ 100000)。
输出描述:
输出共两行,每行各一个整数。第一行表示 Forest 最后的豆豆数,第二行表示 Gold Rong 最后的豆豆数。
示例1
输入
1255433
输出
5431
532
示例2
输入
101010
输出
110
100
示例3
输入
10000
输出
100
0
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s; cin>>s;
string f, g;
sort(s.begin(), s.end(), greater<int>());//从大到小排序
int flag = 1;
for(int i=0;i<s.size();i++)
{
if(flag)//第一个先拿
{
if(f != "0" )f += s[i];//若第一个拿的是0,则后面全是0,只需要输出一个
flag = 0;
}
else//第二个拿
{
if(g != "0") g += s[i];//若第一个拿的是0,则后面全是0,只需要输出一个
flag = 1;
}
}
cout<<f<<'\n'<<g;
return 0;
}
M-选数异或
题目描述
示例1
输入
3
6 0 12
输出
3
说明
6 xor 0 = 6,6 xor 12 = 10,0 xor 12 = 12,因此三个数对 (1,2) (1,3) (2,3) 都符合条件。
示例2
输入
4
1 1 2 3
输出
5
说明
有五个数对符合条件:(1,3) (1,4) (2,3) (2,4) (3,4)
/*若两个数相同,则二进制一定相同,异或之后为0,若两个数不相同,则二进制至少有一位数不相同,则异或之后为1。*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll>s;
ll a[1000001];
ll all;
int main()
{
ll n;cin>>n;
for(int i=0;i<n;i++){
ll num;scanf("%lld",&num);
if(s.insert(num).second==false){a[num]++;all+=a[num];}//若未插入数组里面,返回值为false,则all计数的每一次都加上未插进去的数的个数。
}
n--;
cout<<(n+(n*(n-1)/2)-all);//等差数列求和减去不符合要求的(重复的数)个数
return 0;
}