第 18 场 小白入门赛(蓝桥)水浒专场!!

第二题:情报传递1

代码1(c++):

#include <iostream>
using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int a, b, c;
        cin >> a >> b >> c;
        int steps = 0; 
        while (a < b) {
            if (a % c == 0) {
                a++; 
                continue;
            }
            if (a + 2 <= b && (a + 2) % c != 0) {
                a += 2; 
            } else {
                a++;
            }
            steps++; 
        }
        
        cout << steps << endl;
    }
    return 0;
}

算法包含bfs,可以利用对题目分析,避免筛选的情况进行求解。

代码2(c):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int t;
  scanf("%d",&t);
  for(int i = 0; i < t; i++){
    int a,b,c;
    int day = 0;
    scanf("%d %d %d",&a,&b,&c);
    while(a != b){
      if( (a+2) % c != 0 && (a+2) <= b){
        a = a + 2;
        day++;
      }
      else{
        a = a + 1;
        day++;
      }
    }
    printf("%d",day);
  }
}

第三题:村长分钱

关键语句:其一,”只要满足 n 除以 x 后的余数为 k“,可以利用数学公式n/x=zi.....k,k即为该除法的余数;其二,包含两个整数 n的范围较大,为10的九次方,使用long long定义。

代码1

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
  ll n,k,x=0,h=0,c=0;
  cin>>n>>k;
  n=n-k;
  for(ll i=1;i<=sqrt(n);i++){
    if(n%i==0){
       if(i>k){
         x++;
       }
       if(i!=n/i&&n/i>k){
        x++;
       }
    }
  }
  cout<<x;
  return 0;
}

条件解释

  • if(i > k)

    • 这个条件检查当前因子 i 是否大于 k
    • 如果 i 是 n 的一个因子,并且 i 大于 k,则计数器 x 增加 1。
    • 意思是:我们只关心大于 k 的因子。
  • if(i != n / i && n / i > k)

    • 这个条件检查 n / i(即 n 的另一个因子,和 i 配对)是否与 i 不相等,并且 n / i 是否大于 k
    • i != n / i 确保我们不重复计算相同的因子(例如,当 n 是完全平方数时)。
    • 如果 n / i 是 n 的因子,并且大于 k,则计数器 x 也增加 1

优点:避免超时,可以节省了运算的次数,利于快速得到答案。

第四题:情报传递2

代码:(来自@Leavery)

#include <iostream>
using namespace std;

int main() {
  int t;
  cin>>t;
  while (t--) {
    int a,b,c;
    cin>>a>>b>>c;
    if (a/c == b/c) {
      cout<<(b-a+1)/2<<'\n';
    } else if (c%2 == 0) {
      if (a%2 == 1) {
        cout<<(b-a+1)/2<<'\n';
      } else {
        cout<<(b-a)/2+1<<'\n';
      }
    } else {
      int t1 = a/c*c+c;
      int t2 = b/c*c;
      int a1 = (t1-1-a+1)/2+1;
      int a3 = (b-t2-1+1)/2;
      int a2 = (c+1)/2 * (b/c-a/c-1);
      cout<<a1+a2+a3<<'\n';
    }
  }
  
  return 0;
}

第五题:好汉身份 

代码:(来自@照猫画虎)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
bool c(pair<int ,int > a,pair<int, int> b)
{
    return a.first+a.second <= b.first + b.second;//按和从小到大比价,若小,返回true,数组内的a,b,不移动
}
int main()
{
    long long n, sum = 0;//必须为longlong ,不然会爆
    cin >> n;
    pair <int, int> a[N];
    for (int i = 0; i < 2 * n; i++)
        cin >> a[i].first;//将原价存入pair的第一个数中
    for (int i = 0; i < 2 * n; i++)
        cin >> a[i].second;//将特价存入pair的第二个数中
    sort(a,a + 2 * n,c);//将0到2*n-1个数排序,排序标准按c函数执行
    for (int i = 0; i < 2 * n; i++)
    {
                //两人从小到大按顺序贪心拿取
        if(i % 2==0) sum += a[i].first;
        else sum -= a[i].second;
    }
    cout << sum;
    return 0;
}

第六题:武功秘籍

代码:(来自@做不了一点)

#include <iostream>
using namespace std;
using ll=long long;
int main()
{
  ll n,k;
  cin>>n>>k;
  ll num=n%10+1,ans=(k-1)%(n%10+1);
  ll a=10;
  n/=10;
  while(k>num){
    ans=((k-1)/num)%(n%10+1)*a+ans;
    num+=(n%10)*num;
    n/=10;
    a*=10;
  }
  cout<<ans;
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值