CSDN竞赛14期·12月11日考试
Posted 酷酷的Herio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSDN竞赛14期·12月11日考试相关的知识,希望对你有一定的参考价值。
CSDN竞赛14期·12月11日考试
1、题目名称:字符串全排列
// 请关闭中文输入法,用英文的字母和标点符号。
// 如果你想运行系统测试用例,请点击【执行代码】按钮,如果你想提交作答结果,请点击【提交】按钮,
// 注意:除答案外,请不要打印其他任何多余的字符,以免影响结果验证
// 本OJ系统是基于 OxCoder 技术开发,网址:www.oxcoder.com
// 模版代码提供基本的输入输出框架,可按个人代码习惯修改
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
std::string fun(int n, vector<string>&v)
std::string result;
// TODO:
string u = v[0];
sort(u.begin(),u.end());
unordered_map<string,bool>mp;
for(auto s:v) mp[s] = true;
do
if(!mp.count(u))
return u;
while(next_permutation(u.begin(),u.end()));
return result;
int main()
int n ;cin>>n;
string s;
vector<string>v;
if(!n) return 0;
for(int i=1;i<=n;i++)
cin>>s;
v.push_back(s);
cout<<fun(n,v);
return 0;
直接利用库函数next_permutation
进行模拟即可。
时间复杂度: O ( k ! ) O(k!) O(k!)
2、题目名称:小Q新式棋盘
已知棋盘大小为n*n。 每个位置都有自己的权值q。 该棋盘中有多少对行权值和小于列权值和。
// 请关闭中文输入法,用英文的字母和标点符号。
// 如果你想运行系统测试用例,请点击【执行代码】按钮,如果你想提交作答结果,请点击【提交】按钮,
// 注意:除答案外,请不要打印其他任何多余的字符,以免影响结果验证
// 本OJ系统是基于 OxCoder 技术开发,网址:www.oxcoder.com
// 模版代码提供基本的输入输出框架,可按个人代码习惯修改
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int a[N][N],b[N],pre[N];
int main()
int n ;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
pre[i] = pre[i]+a[i][j];
b[j]=b[j]+a[i][j];
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(pre[i]<b[j]) ans++;
cout<<ans;
return 0;
统计行和列的前缀和,然后遍历即可。
时间复杂度: O ( n 2 ) O(n^2) O(n2)
3、题目名称:因数-数字游戏
小Q的柠檬汁做完了。 掏出了自己的数字卡牌。 想要和别人做数字游戏。 可是她又不想要输掉游戏。 她制定好规则,每 次每个人只能把这个牌换成它的因子的某个牌。 但是这个因子不能是1或者整数本身。 现在给出整数n。 两个人开始做游 戏,谁无法再给出因子牌则该人胜利,如果该整数无因子牌直接视为先手胜利,请判断先手在最优策略状态下能否必胜,
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int solution(long long n)
int result;
// TODO:
long long cnt = 0;
for(long long i=2;i*i<=n;i++)
if(n%i==0)
while(n%i==0)
n/=i;
cnt++;
if(n>1) cnt++;
if(cnt==0) return 1;
if(cnt==2) return 2;
return 1;
int main()
long long n;
std::cin>>n;
int result = solution(n);
std::cout<<result<<std::endl;
return 0;
根据题意可知,我们只需要统计质因子的个数即可。
根据个数进行特判。
时间复杂度: O ( n ) O(\\sqrtn) O(n)
4、题目名称:编码
编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。 字母 表中共有26个字母a,b,…,z,这些特殊的单词长度不超过6且字母按升序排列。把所有这样的长度相同的单词放在 一起,按字典顺序排列(a…z,ab…az,bc…bz…)一个单词的编码就对应着它在整个序列中的位置。 你的任务就是对 于所给的单词,求出它的编码。
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int cnt;
string now ;
int nn;
void dfs(string s,int x)
if(x==nn-1)
//cout<<s<<'\\n';
if(s<=now) cnt++;
return;
for(char c=(x==-1?'a':s[x]+1);c<='z';c++)
dfs(s+c,x+1);
int solution(std::string s)
cnt = 0;
int x=0;
now = s;
// TODO:
int n = s.size();
if(n>6) return 0;
for(int i=0;i<n;i++)
if(!islower(s[i])) return 0;
nn=n;
for(int i=1;i<n;i++)
if(s[i]<=s[i-1]) return 0;
//int m = 26;
for(int i=1;i<n;i++)
int m = 1;
for(int j=26;j>=26-i+1;j--)
m=m*j;
for(int j=1;j<=i;j++) m/=j;
// printf("m=%d\\n",m);
x+=m;
dfs("",-1);
//printf("cnt=%d\\n",cnt);
x+=cnt;
// return x;
return x;
int main()
std::string word;
getline(std::cin, word);;
int result = solution(word);
std::cout<<result<<std::endl;
return 0;
先统计小于位数的个数,然后统计位数相同的有多少个即可。
以上是关于CSDN竞赛14期·12月11日考试的主要内容,如果未能解决你的问题,请参考以下文章