牛客编程巅峰赛S1第5场 - 青铜&白银 A.字符串 B.枚举 C.归并排序(逆序对)

链接: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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值