2021年度训练联盟热身训练赛第四场

D.Happy Number

题意:给一个数,判断是不是快乐数。把这个数各个位上的数的平方累加,得到一个新的数字,重复进行同样的操作,如果最终结果变成了1,则说明是快乐数;如果一直循环但不是1的话,就不是快乐数。

题解:判断得到的数是否有1,如果得到1,就是快乐数。如果得到的数有重复且不是1.就不是快乐数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100000];
int main(){
    ll n,t;
    cin>>n;
    while(1){
        t=0;
        while(n){
            t+=(n%10)*(n%10);
            n/=10;
        }
        if(t==1){
            cout<<"HAPPY"<<endl;
            return 0;
        }
        if(a[t]){
            cout<<"UNHAPPY"<<endl;
            return 0;
        }
        a[t]=1;
        n=t;        
    }
}
View Code

 

I.Slot Machines

题意:给n个数,前k个数不算,后面的数形成循环节,使k+p最小,如果有多组相同的最小k+p,选p最小的

题解:把输入的数字看作是字符,用KMP算法来求周期,循环节长度为i - s[i],循环次数为:i/(i-s[i])

#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<set> 
using namespace std;
typedef long long ll;
#define MAXN 1000010
int n;
int a[MAXN];
int s[MAXN] ;
void getnext(){
    int i=0,j=-1;
    s[i]=j;
    while(i<n){
        if(a[i]==a[j]||j==-1){
            i++,j++;
            s[i]=j;
        }else{
            j=s[j];
        }
    }
} 
int main(){
    cin>>n;
    int maxx=0,ans=0,sum=0;
    for(int i=n-1;i>=0;i--){
        cin>>a[i];
    }
    getnext();
    int p=100000000,k=100000000,tp,tk;
    for(int i=1;i<=n;i++){
        tk=n-i;
        tp=i-s[i];
        if(tp+tk<p+k){
            p=tp;
            k=tk;
        }
    }
    cout<<k<<" "<<p<<endl;
    return 0;
}
View Code

 

 

 

 

 
posted @ 2021-04-03 17:31  Endeavo_r  阅读(91)  评论(0)    收藏  举报