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