AtCoder Beginner Contest 161(D(优先队列),E(模拟),F(数学推导))

题目链接

D - Lunlun Number

题意:定义一个数是好的 :相邻的每一位相差的绝对值小于等于1,输入k,要你求第k小的 好的  数。

做法,优先队列放进1,2,3,4,5,6,7,8,9  每次取出一个,有三种变化形式可以放回去:

末尾连接上当前的个位数,个位数减一  个位数加1

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int a[200],len;
int main()
{int k;
   cin>>k;
   if(k<=12){
      cout<<k;
      return 0;
   }
   priority_queue<ll,vector<ll>,greater<ll>> pq;
   for(int i=1;i<=9;i++)
   pq.push(i);

   int cnt=0;
   ll ans;
   while(true){
      ll num=pq.top();
      pq.pop();
      cnt++;

      if(cnt==k){
         ans=num;
         break;
      }

      int ld=num%10;
      ll num1=num*10+ld;
      pq.push(num1);

      if(ld!=0){
         num1=num*10+ld-1;
         pq.push(num1);
      }
      if(ld!=9){
         num1=num*10+ld+1;
         pq.push(num1);
      }
   }
   cout<<ans;
}

E - Yutori

题意:输入n,k,c  和n长度的字符串s。

你要在s串中选择'o'字符工作k天,主人公是懒鬼,每次工作一天就要休息c天。

问至少工作k天时,哪些天是必须要工作的?

做法:正着贪心模拟一下,反正贪心模拟一下,存在一种模拟的工作天数大于k那就是没有答案。否则就是两种模拟的交集即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=2e5+10;
int n,k,c,pre[N];
char s[N];
int main()
{
    cin>>n>>k>>c;
    cin>>s+1;
    set<int>st1,st2;
    for(int i=1;i<=n;++i){
        if(s[i]=='x') continue;
        else{
            st1.insert(i);
            i+=c;
        }
    }

    for(int i=n;i>=1;--i){
        if(s[i]=='x') continue;
        else st2.insert(i),i-=c;
    }
    if(st1.size()>k||st2.size()>k) return 0;
    else{
        for(int v:st1){
            if(st2.count(v)) printf("%d\n",v);
        }
    }
}

F - Division or Substraction

题意:给你一个N,要你K的合法方案数。

K的选择条件:

如果K整除N   那么 N=N/K

否则  N=N-K

一直操作下去,使得N最后等于1.

做法:不会,搜的题解来自:

简单想想:n=0时   N%(N-1)==1   那么N%  (N-1)的因子也是等于1的。

n>0时   能整除N  的只有N的因子了,看了题解好简单,不看题解自己就不会想题了,难搞

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll n;cin>>n;

    set<ll> st;
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            ll t=n;
            while(t%i==0) t/=i;
            if(t%i==1) st.insert(i);
        }
    }
    for(ll i=1;i*i<=n-1;i++){
        if((n-1)%i==0){
            st.insert(i);
            st.insert((n-1)/i);
        } 
    }
    st.erase(1);
    st.insert(n);

    cout<<st.size()<<"\n";
    
    return 0;
}
发布了519 篇原创文章 · 获赞 69 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/105329129