这道题可以说是一道阅读理解题,考语文。
题意就给你俩字符串,一密码一原文,让你判断是否翻得合理。
但是这道题判断是否合理其实就是判断一个原文和密码中出现次数相同的字母个数是否相同。因为其实题中所说的替换和顺序变换两种处理方式使得原文变化成密码只需要原文和密码中出现次数相同的字母个数相同就行了。
照此原理:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<list>
#include<vector>
using namespace std;
const int MAXN = 30;
int usdo[MAXN],usdm[MAXN];
string ori,mi;
int main()
{
// freopen("cryptogram.in","r",stdin);
// freopen("cryptogram.out","w",stdout);
cin >> mi >> ori;
if(mi.size() != ori.size())
{
cout << "NO";
return 0;
}
else
{
for(int i = 0;i < mi.size();i++)
{
usdo[ori[i] - 'A']++;
usdm[mi[i] - 'A']++;
}
sort(usdo,usdo + 26);
sort(usdm,usdm + 26);
for(int i = 0;i < 26;i++)
{
if(usdo[i] != usdm[i])
{
cout << "NO";
return 0;
}
塔。
这是道神奇的题。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll maxc = -100,ans;
ll m;
void calc(ll now,ll cnt,ll sum)
{
ll len = (ll)pow(now,1 / 3.0);
if(now == 0)
{
if(cnt > maxc || (cnt == maxc && sum > ans))
{
maxc = cnt;
ans = sum;
}
return;
}
calc(now - pow(len,3),cnt + 1,sum+pow(len,3));
calc(pow(len,3) - 1 - pow(len - 1,3),cnt + 1,sum + pow(len - 1,3));
}
int main()
{
cin >> m;
calc(m,0,0);
cout << maxc << " " << ans;
return 0;
}