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

浙公网安备 33010602011771号