zoukankan      html  css  js  c++  java
  • 百度之星-初赛二

    a搬砖之余看到了几个月前报名的百度之星初赛的短信通知,emmm,那就参加试试吧。就搞定了前两题,记录一下吧

    第一题.签到

    题目链接
    思路:

    通过下面的k依次变大,我们可以得到下面两个公式

    a b k
    a b 0
    a+b a-b 1
    2a 2b 2
    2(a+b) 2(a-b) 3
    4a 4b 4
    4(a+b) 4(a-b) 5
    .... .... ....
    2(k/2)*(a+b) 2(k/2)*(a-b) k%2==1
    2(k/2)*a 2(k/2)*b k%2==0

    但是这里的k很大,并且结果还要取模,所以我们这里应该用快速幂去求。

    但是在这里我没有注意到负数取模的问题,所以一直不知道哪里错,最后看了题目下面的提问才知道。对于(a-b)可能出现负数,比如(-3)%10,程序算的会是-3,而正确的应该是(-3)%10+10 = 7,代码里我们让它再加上一下我们取的模就可以了。

    代码:

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll mod = 998244353;
    
    ll Pow(ll a, ll b)
    {
        ll sum = 1;
        while (b) {
            if (b & 1) {
                sum = (sum * a) % mod;
                b--;
            }
            b /= 2;
            a = a * a % mod;
        }
        return sum;
    }
    
    int main()
    {
        int t;
        cin >> t;
        while(t--){
            ll a,b,k;
            ll a1,b1;
            cin >> a >> b >> k;
            if(k%2==1){
                a1 = (((a+b)%mod)*Pow(2,k/2))%mod;
                b1 = (((a-b+mod)%mod)*Pow(2,k/2))%mod;
            }
            else{
                a1 = (Pow(2,k/2)*a)%mod;
                b1 = (Pow(2,k/2)*b)%mod;
            }
            cout << a1 << " " << b1 << endl;
        }
        return 0;
    }
    

    第二题.随机题意

    题目链接
    思路

    这是一道贪心的题目,主要思想是对a数组排序一下,对于每个a[i], b[i]满足我们贪心要求的取值范围是 [a[i]-k,a[i]+k] ,我们每次取我们能取到的最小的那个数,通过设置一个min_x来记录上次b[i]取的数,我们就在当前范围取一个最小且比min_x大的数,如果取不到就继续下面的b[i],统计能取到的数的个数,就是答案。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+5;
    int a[maxn];
    int main()
    {
        int t;
        cin >> t;
        while(t--){
            int n,k;
            cin >> n >> k;
            for(int i=0;i<n;i++)
                scanf("%d",&a[i]);//cin >> a[i];这里使用C的scanf,不然会超时
            sort(a,a+n);
            int cnt = 0;
            int min_x = a[0]-k-1;
            for(int i=0;i<n;i++){
                int Max = a[i]+k;
                int Min = a[i]-k;
                if(Min<=min_x && min_x<Max){
                    cnt++;
                    min_x++;
                }
                else if(Min>min_x){
                    cnt++;
                    min_x = Min;
                }
            }
            cout << cnt << endl;
        }
        return 0;
    }
    

    官网答案更新了-->答案
    溜了溜了,继续搬砖去了

  • 相关阅读:
    第一周C语言作业
    C语言I博客园作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
    C语言II博客作业01
  • 原文地址:https://www.cnblogs.com/123-wind/p/15091451.html
Copyright © 2011-2022 走看看