EOJ Monthly 2020.9华东月赛

    科技2022-08-15  92

    A 题意:给定起点s,从s开始每隔x秒停一次,求经过多少次恰好停在给定区间[l,r]内 思路:根据到达该区间所需的次数判断,如果r/x*x>=l也就是经过r/x即可跳进[l,r]区间此时只需返回跳进该区间的最小次数(l+x-1)/x即可;否则循环继续遍历,直到符合条件或者l>r就跳出

    #include<iostream> #include<algorithm> using namespace std; typedef long long ll; ll solve(ll n,ll x,ll l,ll r) { if(l>r||!x)return 2e9; if(r/x*x>=l)return (l+x-1)/x; ll d=solve(x,n%x,((-r)%x+x)%x,((-l)%x+x)%x); if(d==2e9)return 2e9; return (l+x-1+d*n)/x; } int main() { int t; scanf("%d",&t); while(t--){ ll x,n,s,l,r; scanf("%lld%lld%lld%lld%lld",&x,&n,&s,&l,&r); l=(l-s+n)%n,r=(r-s+n)%n; ll ans; if(l<=r)ans=solve(n,x,l,r); else ans=min(solve(n,x,0,r),solve(n,x,l,n-1)); if(ans<1e9)printf("%lld\n",ans); else puts("-1\n"); } return 0; }

    E 题意:给出一串数字求是否存在连续自然数列即这串数字的密文,存在输出区间,不存在打印-1 思路:因为密文最终是一位数的自然数,因此肯定是0~9这几个数字,对数组每个元素mod9后判断是否连续,连续则可输出最后结果,否则-1,注意当其为9的倍数的时候处理一下让其仍然为9,否则会mod变成0

    #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=1e3+10; int a[N]; int main() { int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; for(int i=0;i<n;i++){ if(a[i]&&a[i]%9==0)a[i]=9; else a[i]%=9; } int num=a[0]; bool flag=true; for(int i=0;i<n;i++){ if(a[i]!=num){ flag=false; break; } num++; if(num&&num%9==0)num=9; else num%=9; } if(flag)cout<<a[0]<<' '<<a[0]+n-1<<endl; else puts("-1"); return 0; }
    Processed: 0.013, SQL: 8