简单数学题、数组字符串练习
A - Together
题目描述
题意分析
题意:k个好人和k个坏人围成一圈,数到m的人出局,求最小的m,使得k个坏人在第一个好人之前均被处决。
分析:我们可以用0-k-1为好人,k到2k-1为坏人,m从k开始暴力枚举,最后打表
解题思路
最关键的是出局的坏人的编号,我们用tmp=0从0开始,然后遍历k次,如果tmp这个编号在0到k-1的位置,此时好人出局,不符合,找下一个m。其中出局人的编号是tmp=(tmp+m-1)%(2k-i)。
复杂度分析
外层的while循环用于不断接收输入的k值,直到用户输入0为止。由于只读取k值一次,并且每次迭代之间独立,所以时间复杂度为O(1)。
内层的while循环会不断增加起始位置m的值,直到找到满足条件的m值。最坏情况下,m的值会增加到2*k-1,因此内层while循环的最大迭代次数为O(k)。
内层while循环中,还有一个for循环,它需要执行k次,所以它的时间复杂度为O(k)。
在for循环内部,进行了一些基本的算术运算(加法、减法和取模),这些运算的时间复杂度都是O(1)。
因此,整体算法的时间复杂度为O(k^2)
带注释的代码
#include <iostream>
using namespace std;
int main(){
int k,i; //这里是0-k-1是好人,k到2*k-1坏人
while(cin>>k&&k!=0) { //输入k并且k不等于0
bool flag=false; //先假设不符合要求
int m=k; //肯定要从k开始,如果m是0-k-1的数,那就把好人出局了,不符合条件
while(!flag){ //当m仍然不符合条件的时候
m++; //m再往后大一位
int tmp=0; //起点是0,给tmp,下次tmp值要变化
for (i=0;i<k;i++){ //想要让0-k-1的坏人出局
tmp=(tmp+m-1)%(2*k-i); /*出局者编号,因为本身算1个,所以再数m-1个就数到m了,
后面%的是环成员个数,在不断减小
开始是2k个人,然后2k-1,人数逐渐减少
*/
if(tmp<=k-1) break; //如果编号是在0-k-1范围内,好人出局了,不符合条件
if(i==k-1) flag=true; //0-k-1坏人均被淘汰。
}
}
printf("%d\n",m);
}
return 0;
}
C - Fibonacci Again
题意分析
题意:对于给定的每行的n,看其值是否是3的倍数,如果是的话就输出yes,否则输出no
分析:找规律即可
解题思路
我们发现从n=2开始,每次往后4个都是3的倍数,所以n%4余下2的数都是符合条件的数
复杂度分析
时间复杂度:每次读取一个整数n,判断是否被4整除余2,时间复杂度为O(1)。
空间复杂度:没有使用额外空间,空间复杂度为O(1)。
算法的总体时间和空间复杂度如下:
时间复杂度:O(1)
空间复杂度:O(1)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
while (cin >> n) {
if (n == 0) {
cout << "no" << endl;
continue;
}
if (n % 4 == 2) {
cout << "yes" << endl;
} else {
cout << "no" << endl;
}
}
return 0;
}
D - Rightmost Digit
题意分析
题意:找N的N次方的末尾数字
分析:找规律即可
解题思路
我们可以从3开始看,第一个数3,第二个数9,第三个数27,第四个数81,第五个数243,第六个数729,4个一循环,3,9,7,1
复杂度分析
- 时间复杂度 O(1) : 只需要常数次求幂和取余运算,所以时间复杂度为 O(1)。
- 空间复杂度 O(1) : 只需要常数大小的数组a来存储结果,所以空间复杂度为 O(1)。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll t;
cin>>t;
while(t--) {
ll n;
cin>>n;
ll a[5];
ll k=n;
for(int i=1;i<=4;i++) { //把前4次末尾的数字存到数组1-4
a[i]=k%10;
k=(k*n)%10; //这里数可能过大,只要取出末尾数字即可
}
ll index=n%4;
if(index==0) index=4; //注意:如果是0的话是1-4个循环的第4个
cout<<a[index]<<endl; //输出即可
}
return 0;
}