A - Last CardA - Last Card
题目大意
一共 K 张卡片分发给 N 个人,这些人的编号为 1, 2, …, N
从第 A 个人开始,按照顺序依次将卡片发给以下人员:A, A+1, A+2, …, N, 1, 2, …问最后一个卡片将发给哪个人?
具体来说,当第 x(1≤x<N) 个人收到卡片后,第 x+1 个人将收到卡片。当第 N 个人收到卡片后,第 1个人将收到卡片。
思路分析
取模时特判一下ans==0的情况
ans = (a + k - 1) % n
时间复杂度
O(1)
AC代码
#include <bits/stdc++.h>
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
题目大意
判断有多少个人的猜测肯定是错误的。根据所给的建筑面积公式4ab+3a+3b。如果存在一组a和b使得计算出的面积等于某个人的猜测面积,则说明该人的猜测是正确的。
思路分析
因为数据范围小,所以可以通过枚举a和b的值来计算出可能的建筑面积。
时间复杂度
O(N2)
AC代码
#include<bits/stdc++.h>
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
题目大意
给定一个正整数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<bits/stdc++.h>
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;
}