问题标题: 酷町堂:70豆 在 明天 9:00 前采纳 第一个&回答的很好的-----周期(上):周期常识 预习

0
0

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
胡家翊
胡家翊
高级守护
高级守护

我一看到你发贴,就立马跑过来蹭贴,因为你发的贴除了问作业就是预习[doge]

0
陈喆鹏
陈喆鹏
资深光能
资深光能

course.codingtang.com里能看到课堂讲义

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;
}

我这个暑假刚上完

我要回答