链接:https://ac.nowcoder.com/acm/contest/6488/A
来源:牛客网
题目描述
牛牛截获了一段由凯撒密码加密过的密文,凯撒密码指的是将字符偏移一定的单位,例如若偏移量为2,则a替换为c,b替换为d,c替换为e,…,z替换为b。若加密nowcoder,则密文为pqyeqfgt。现在牛牛发现对方加密包括数字、大写字母、小写字母,即0-9、A-Z、a-z的排列顺序进行偏移,现在牛牛截获了对方的一段密文以及偏移量,你能帮助牛牛破解密文吗。即给定一段密文str和偏移量d,求对应的明文。
示例1
输入
复制
“pqyeqfgt”,2
输出
复制
“nowcoder”
示例2
输入
复制
“123ABCabc”,3
输出
复制
“yz0789XYZ”
备注:
1≤∣str∣≤1000,1≤d≤61,d为加密时的偏移量
class Solution {
public:
/**
* 解密密文
* @param str string字符串 密文
* @param d int整型 偏移量
* @return string字符串
*/
string decode(string str, int d) {
// write code here
string str1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
string ans;
for(int i=0;i<str.size();i++){
int t=str1.find(str[i]);
ans+=str1[(t-d+62)%62];
}
return ans;
}
};
链接:https://ac.nowcoder.com/acm/contest/6488/B
来源:牛客网
题目描述
我们把一个能被表示成某个整数的平方的数称为完全平方数。
例如4 = 2 * 24=2∗2,16 = 4 * 416=4∗4,所以44,1616是完全平方数。
现在输入一个整数为xx(0\leq x \leq9990≤x≤999),请聪明的你判断它是不是由某个完全平方数对10001000取模得到的呢。
示例1
输入
复制
24
输出
复制
true
说明
1024 = 32 *32
24 = 1024 mod1000
备注:
1024 = 32 *32
24=1024 mod1000
class Solution {
public:
/**
*
* @param x int整型
* @return bool布尔型
*/
bool solve(int x) {
for(int i=1;i<=1000;i++){
if(i*i%1000==x){
return true;
}
}
return false;
}
};
链接:https://ac.nowcoder.com/acm/contest/6488/C
来源:牛客网
题目描述
牛妹在银行排队等号时,观察到以下场景。
银行有m个服务窗口,假设当前有n个人等待办理业务,那么这n个人会被顺序分配一个从1到n的号码。
等待办理业务的流程如下:
从第1号到第n号顺序的进行排队。
假设当前第1号到第i-1号都正在办理或已经办理完业务,且某个窗口A没有客人正在办理业务,那么第i号会马上到窗口A办理他的业务。
如果有多个这样的窗口,第i号会随意选择一个窗口。
在0时刻,牛妹观察到m个窗口都没有客人正在办理业务,而n个人正在等待办理业务。
为了简化问题,我们假设第i号不管在哪个窗口办理业务,办理业务的时间都为a_ia
i
。
牛妹想知道有多少对(i,j),满足1\leq i<j\leq n1≤i<j≤n,且第i号办理业务完成的时间严格大于第j号办理业务完成的时间。
示例1
输入
复制
5,2,[1,3,2,5,4]
输出
复制
1
说明
第1号 开始办理时间 0 办理完成时间 1
第2号 开始办理时间 0 办理完成时间 3
第3号 开始办理时间 1 办理完成时间 3 (在1号办理完同时开始办理)
第4号 开始办理时间 3 办理完成时间 8 (在2和3号办理完同时开始办理)
第5号 开始办理时间 3 办理完成时间 7 (在2和3号办理完同时开始办理)
唯一一组满足题意的(i,j)对为(4,5)
备注:
对于30%数据,1\leq n,m \leq 10001≤n,m≤1000。
对于100%数据,1\leq n,m \leq 1000001≤n,m≤100000,1\leq a_i \leq 1e91≤a
i
≤1e9
typedef long long ll;
const int maxn=1e5+5;
ll h[maxn],temp[maxn];
class Solution {
public:
/**
* 求解合法的(i,j)对的数量
* @param n int整型 n个人
* @param m int整型 m个窗口
* @param a int整型vector 长度为n的vector,顺序表示1-n号客人的办理业务所需时间
* @return long长整型
*/
void uni(ll L,ll R,ll mid ,ll &sum){
ll l=L,r=mid+1,k=1;
while(l<=mid&&r<=R){
if(h[l]<=h[r]){
temp[k++]=h[l++];
}
else {
sum+=mid-l+1;
temp[k++]=h[r++];
}
}
while(l<=mid){
temp[k++]=h[l++];
}
while(r<=R){
temp[k++]=h[r++];
}
for(int i=L,j=1;i<=R;i++,j++){
h[i]=temp[j];
}
return ;
}
void merge(ll l,ll r,ll &sum){
if(l>=r)return ;
ll mid=l+r>>1;
merge(l,mid,sum);
merge(mid+1,r,sum);
uni(l,r,mid,sum);
}
long long getNumValidPairs(int n, int m, vector<int>& a) {
// write code here
priority_queue<ll,vector<ll>,greater<ll> >q;
while(m--){
q.push(0);
}
for(int i=0;i<n;i++){
ll t=q.top()+a[i];
q.pop();
h[i+1]=t;
q.push(t);
}
ll ans=0;
merge(1,n,ans);
return ans;
}
};