0
1
曲天歌
高级光能
高级光能
周期(下):周期应用题课后讲义(v2)
周期(下)周期应用题
引言
哈雷彗星总能被预测在哪一年会靠近地球,因为它做的是周期运动,大约每76.1年环绕太阳一周,当它靠近地球的时候就能被人们用肉眼看到。
一、课堂知识
1. 周期行动可以被预测
如果一个行为是周期的,那么我们总能预测在第几个时刻或第几次或发生某事。
比如:四季的更替是周期的,春季的下一个季度总是夏季,从春季往后推四个季度还是春季 ……
2. 使用模运算确定第i次要做的事对应周期内的哪一件事
假如一个周期有7秒,每秒会发生一件事,那么一个周期会发生7件事,而后续会不断重复这7件事。
如果恰好从第一秒开始做周期内的第一件事,则在第i秒做的事我们可以预测,对应周期内的第i%7件事(如果i%7等于0,则对应的是第7件事)。
二、课堂练习详解
1482 狐狸追兔子
思路解析
洞口一共10个,狐狸跑过第10个洞口之后要回到第1个洞口继续找,这里我们可以把洞口看成无限多个,但是每10个洞(编号1~10)为一周期,无限重复。
每次隔一个洞,隔两个洞,隔三个洞……确定洞口的编号,我们把这个编号模10就能得到它对应几号洞。
由于模10的结果在0~9的范围内,所以我们可以做个小转化,把1~10号洞口对应数字0~9,(模10得到0说明在1号洞,得到1说明在2号洞 ……)
代码实现
#include <iostream>
using namespace std;
int a[10],cnt=9; //a[0]~a[9]分别表示进1~10号洞的次数,cnt=9出发点在10号洞
int main(){
for(int i=1;i<=1000;i++){
cnt=(cnt+i)%10;
a[cnt]++;
}
for(int i=0;i<=9;i++){ //枚举a[0]~a[9](1到10号洞)
if(a[i]==0){ //表示i+1号洞没进过
cout<<i+1;
}
}
return 0;
}
1353 出牌游戏(game)
思路解析
两人按照各自的周期出牌,我们可以预测到在第i次出牌时,两人各出哪张牌(每个人出的牌按各自的周期单独算),所以只要将每一局比赛中两人出的牌相比较,将结果统计起来即可。
注意这里我们输入每个人出的牌时(存数组),可以从下标0开始输入,方便后面模运算“i%周期”直接对应 0~周期-1 的每个数。
代码实现
#include<iostream>
using namespace std;
int pk(int a,int b)
{
if(a==b-1 || (a==4&&b==1)) return 1; //A赢
if(a==b+1 || (a==1&&b==4)) return -1; //B赢
else return 0; //平局
}
int main()
{
int n,na,nb,a[101],b[101],A=0,B=0; //A:统计A赢的局数 B:统计B赢的局数
cin>>n>>na>>nb;
for(int i=0;i<na;i++) cin>>a[i];
for(int i=0;i<nb;i++) cin>>b[i];
for(int i=0;i<n;i++){
if(pk(a[i%na],b[i%nb])==1) A++;
else if(pk(a[i%na],b[i%nb])==-1) B++;
}
if(A>B) cout<<"A";
else if(A<B) cout<<"B";
else cout<<"D";
return 0;
}
3878 周期字符串
思路解析
同上题
代码实现
#include<iostream>
using namespace std;
int pk(int a, int b) {//两个人出拳
if(a==1&&b==3 || a==2&&b==1 || a==3&&b=2) return 1; //A赢
if(a==3&&b==1 || a==1&&b==2 || a==2&&b==3) return -1; //B贏
return 0; //平局
}
int main()
{
int n,na,nb,a[101],b[101],A=0,B=0; //A:统计A赢的局数 B:统计B赢的局数
cin>>n>>na>>nb;
for(int i=0;i<na;i++) cin>>a[i];
for(int i=0;i<nb;i++) cin>>b[i];
for(int i=0;i<n;i++){
if(pk(a[i%na],b[i%nb])==1) A++;
else if(pk(a[i%na],b[i%nb])==-1) B++;
}
if(A>B) cout<<"A";
else if(A<B) cout<<"B";
else cout<<"D";
return 0;
}
采纳我吧,手机打字好累啊!
0
0
0
0
0
褚俊皓
新手天翼
新手天翼
周期上:
周期(上):周期常识课后讲义(v2)
周期(上):周期常识
引言
太阳每天东升西落;钟表上的指针转了一圈又一圈;今天是周日,过了7天之后还是周日 ……
这些都是日常生活中出现的周期事件。
你还能想到有哪些周期事件吗?
一、课堂知识
1. 周期
事物在运动、变化过程中,某些特征多次重复出现,其连续两次出现所经过的时间叫“周期”。
我们要抓住周期关键的地方,就是重复,隔了多长时间重复出现。
类似0,1,2,3,0,1,2,3,……这种以相同规律多次重复出现的数,我们称这些数具有周期,而连续两次出现之间的间隔就是周期的值。
比如上面的数每4个出现一次相同的数,周期就是4。
2. 周期与模运算
周期问题一般都牵涉到模运算以及数组,我们将一个周期的数据放到数组中,通过模运算来推定第i次要用的是哪一个值。
比如3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,……这一数列,周期是4。
我们可以把3,4,1,2存入数组a[4]中,注意3,4,1分别存入a[1],a[2],a[3]中,而2存入a[0]。
这样第i次会出现的数字就是a[i%4](i如果是4的倍数,那么i%4等于0,所以把第4的倍数次出现的2存入a[0])。
二、课堂练习详解
3881 循环小数
思路解析
该循环小数周期是11,分别是1,4,5,1,2,7,8,5,6,8,9这11个数字循环出现,那么我们可以把这11个数字存入数组a[11]中,注意前10个数字分别赋值给a[1]~a[10],但最后一个9应该赋值给a[0],这样小数点后第n位数字就应该是a[n%11]
代码实现
#include <iostream>
using namespace std;
int a[11]={9,1,4,5,1,2,7,8,5,6,8};
int main()
{
int n,t;
cin>>t;
while(t--)
{
cin>>n;
cout<<a[n%11]<<endl;
}
return 0;
}
3886 倒着转的分针
思路解析
首先要清楚分针转一圈是一个小时而不是一分钟。
那么从m点整往前推n小时是几点呢?
我们知道往前推24小时,时间肯定不变,所以可以对n除以24求余数(因为24的整数倍不影响时间变化),也就是m点往前推n%24个小时。
但是要注意的是m-n%24可能会得到负值,所以要判断一下,是负值的话,加上24小时变成正的值。
代码实现
#include<iostream>
using namespace std;
int main(){
int m,n,t;
cin>>m>>n;
t=m-n%24;
if(t<0) t+=24;
cout<<t;
return 0;
}
3878 周期字符串
思路解析
这里字符串的长度是有限的,我们可以通过枚举可能的周期来找到答案(从1枚举到字符串的长度),
从小到大枚举,取找到的第一个周期。
至于判断字符串是否能以某个数i为周期,我们可以利用周期的特性,比如:
方法一: 字符串中下标模i同余的字符应该都是相等的;
方法二: 截取前i个字符,然后不断重复构成另一个字符串,再与原字符串比较。
代码实现
方法一:
#include <iostream>
#include <string>
using namespace std;
string s;
bool check(int x){
if(s.size()%x!=0) return false;
for(int i=0;i<s.size();i++){
if(s[i]!=s[i%x]) return false;
}
return true;
}
int main(){
cin>>s;
for(int i=1;i<=s.size();i++){ //枚举周期
if(check(i)){ //检查是否能以i为周期,输出最小的周期
cout<<i;
break;
}
}
return 0;
}
方法二:
#include <iostream>
#include <string>
using namespace std;
string s;
bool check(int x){
if(s.size()%x!=0) return false;
string t="";
for(int i=1;i<=s.size()/x;i++){
t+=s.substr(0,x);
}
if(s==t) return true;
else return false;
}
int main(){
cin>>s;
for(int i=1;i<=s.size();i++){ //枚举周期
if(check(i)){ //输出最小的满足条件的周期
cout<<i;
break;
}
}
return 0;
}
周期二:
周期(下):周期应用题课后讲义(v2)
周期(下)周期应用题
引言
哈雷彗星总能被预测在哪一年会靠近地球,因为它做的是周期运动,大约每76.1年环绕太阳一周,当它靠近地球的时候就能被人们用肉眼看到。
一、课堂知识
1. 周期行动可以被预测
如果一个行为是周期的,那么我们总能预测在第几个时刻或第几次或发生某事。
比如:四季的更替是周期的,春季的下一个季度总是夏季,从春季往后推四个季度还是春季 ……
2. 使用模运算确定第i次要做的事对应周期内的哪一件事
假如一个周期有7秒,每秒会发生一件事,那么一个周期会发生7件事,而后续会不断重复这7件事。
如果恰好从第一秒开始做周期内的第一件事,则在第i秒做的事我们可以预测,对应周期内的第i%7件事(如果i%7等于0,则对应的是第7件事)。
二、课堂练习详解
1482 狐狸追兔子
思路解析
洞口一共10个,狐狸跑过第10个洞口之后要回到第1个洞口继续找,这里我们可以把洞口看成无限多个,但是每10个洞(编号1~10)为一周期,无限重复。
每次隔一个洞,隔两个洞,隔三个洞……确定洞口的编号,我们把这个编号模10就能得到它对应几号洞。
由于模10的结果在0~9的范围内,所以我们可以做个小转化,把1~10号洞口对应数字0~9,(模10得到0说明在1号洞,得到1说明在2号洞 ……)
代码实现
#include <iostream>
using namespace std;
int a[10],cnt=9; //a[0]~a[9]分别表示进1~10号洞的次数,cnt=9出发点在10号洞
int main(){
for(int i=1;i<=1000;i++){
cnt=(cnt+i)%10;
a[cnt]++;
}
for(int i=0;i<=9;i++){ //枚举a[0]~a[9](1到10号洞)
if(a[i]==0){ //表示i+1号洞没进过
cout<<i+1;
}
}
return 0;
}
1353 出牌游戏(game)
思路解析
两人按照各自的周期出牌,我们可以预测到在第i次出牌时,两人各出哪张牌(每个人出的牌按各自的周期单独算),所以只要将每一局比赛中两人出的牌相比较,将结果统计起来即可。
注意这里我们输入每个人出的牌时(存数组),可以从下标0开始输入,方便后面模运算“i%周期”直接对应 0~周期-1 的每个数。
代码实现
#include<iostream>
using namespace std;
int pk(int a,int b)
{
if(a==b-1 || (a==4&&b==1)) return 1; //A赢
if(a==b+1 || (a==1&&b==4)) return -1; //B赢
else return 0; //平局
}
int main()
{
int n,na,nb,a[101],b[101],A=0,B=0; //A:统计A赢的局数 B:统计B赢的局数
cin>>n>>na>>nb;
for(int i=0;i<na;i++) cin>>a[i];
for(int i=0;i<nb;i++) cin>>b[i];
for(int i=0;i<n;i++){
if(pk(a[i%na],b[i%nb])==1) A++;
else if(pk(a[i%na],b[i%nb])==-1) B++;
}
if(A>B) cout<<"A";
else if(A<B) cout<<"B";
else cout<<"D";
return 0;
}
3878 周期字符串
思路解析
同上题
代码实现
#include<iostream>
using namespace std;
int pk(int a, int b) {//两个人出拳
if(a==1&&b==3 || a==2&&b==1 || a==3&&b=2) return 1; //A赢
if(a==3&&b==1 || a==1&&b==2 || a==2&&b==3) return -1; //B贏
return 0; //平局
}
int main()
{
int n,na,nb,a[101],b[101],A=0,B=0; //A:统计A赢的局数 B:统计B赢的局数
cin>>n>>na>>nb;
for(int i=0;i<na;i++) cin>>a[i];
for(int i=0;i<nb;i++) cin>>b[i];
for(int i=0;i<n;i++){
if(pk(a[i%na],b[i%nb])==1) A++;
else if(pk(a[i%na],b[i%nb])==-1) B++;
}
if(A>B) cout<<"A";
else if(A<B) cout<<"B";
else cout<<"D";
return 0;
}
我这个暑假刚上完