AtcoderABC227场

A - Last CardA - Last Card

AtcoderABC227场_第1张图片AtcoderABC227场_第2张图片

题目大意

一共 K 张卡片分发给 N 个人,这些人的编号为 1, 2, …, N
从第 A 个人开始,按照顺序依次将卡片发给以下人员:A, A+1, A+2, …, N, 1, 2, …问最后一个卡片将发给哪个人?
具体来说,当第 x(1≤x

思路分析

取模时特判一下ans==0的情况
ans = (a + k - 1) % n

时间复杂度

O(1)

AC代码

#include 
using namespace std;

int main(){
    int n, k, a; 
    cin >> n >> k >> a; 
    int ans = (a + k - 1) % n; // 计算最后一张卡片的编号
    if(ans == 0) ans = n; //特判
    cout << ans << endl; 
    return 0;
}

B - KEYENCE buildingB - KEYENCE building

AtcoderABC227场_第3张图片AtcoderABC227场_第4张图片AtcoderABC227场_第5张图片

题目大意

判断有多少个人的猜测肯定是错误的。根据所给的建筑面积公式4ab+3a+3b。如果存在一组a和b使得计算出的面积等于某个人的猜测面积,则说明该人的猜测是正确的。

思路分析

因为数据范围小,所以可以通过枚举a和b的值来计算出可能的建筑面积。

时间复杂度

O(N2)

AC代码

#include
using namespace std;

int main(){
    int n;
    int s[99];
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>s[i];
    }
    int ans = 0;
    for(int i=0; i<n; i++){
        bool fl = false;
        for(int a=1; a<=1000; a++){
            for(int b=1; b<=1000; b++){
                if(4*a*b + 3*a + 3*b == s[i]){
                    fl = true;
                    break;
                }
            }
            if(fl){
                break;
            }
        }
        if(!fl){
            ans++;
        }
    }
    cout<<ans<<endl;

    return 0;
}

C - ABC conjectureC - ABC conjecture

AtcoderABC227场_第6张图片AtcoderABC227场_第7张图片

题目大意

给定一个正整数N,找出满足条件A≤B≤C和ABC≤N的三个正整数(A, B, C)的个数。

思路分析

因为是不等式,所以枚举确定两个数后,便知道第三个数的取值范围。

  • 首先,可以观察到A、B、C都是从1开始递增的。
  • 其次,可以发现,当固定A和B时,C的最大值为N/(A*B)。
  • 因此,可以使用两个循环来遍历所有可能的A和B的取值范围,并在每次循环中计算满足条件的C的个数。
  • 最后,将所有的满足条件的(A, B, C)个数相加即可得到答案。

时间复杂度

O(√N)

AC代码

#include
using namespace std;
using ll=long long;

int main()
{
  ll n;
  cin>>n; 
  ll ans=0; 

  for(ll a = 1; a*a*a <= n; a++){ 
    for(ll b = a; a*b*b<=n ; b++){ 
      ans += n / (a * b) - b + 1; // 计算满足条件的C的个数并将其加到ans上 
    }
  }
  cout<<ans<<endl; 
  return 0;
}

你可能感兴趣的:(算法)