A. Dislike of Threes
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
int k;
cin>>k;
int cnt=1;
int now=1;
for( int cnt=1;cnt<k;){
now++;
if(now%3==0||now%10==3){
continue;
}
else cnt++;
}
cout<<now<<endl;
}
}
B. Who’s Opposite?
求出圆环的长度即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
int a,b,c;
cin>>a>>b>>c;
int num=abs(a-b);
num*=2;
if(a>num||b>num||c>num){
cout<<"-1"<<endl;
continue;
}
else {
int ans=(c+num/2)%(num);
if(ans==0) cout<<num<<endl;
else
cout<<(c+num/2)%(num)<<endl;
}
}
}
C. Infinity Table
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
int k;
cin>>k;
int be=sqrt(k);
int a=0;
int b=be+1;
int aaa=k-be*be;
if(be*be==k){
cout<<be<<" "<<1<<endl;
continue;
}
for( ;aaa!=0&&a<be+1;aaa--){
a++;
}
for( ;aaa!=0;aaa--){
b--;
}
cout<<a<<" "<<b<<endl;
}
}
D. Make a Power of Two
由于只能在末尾(右侧)加数字,所以预处理所有二的幂,逐个从左到右比较
#include<bits/stdc++.h>
using namespace std;
#define N 200100
typedef long long ll;
string cgstr(ll x){
string res;
while(x){
res+=x%10+'0';
x/=10;
}
reverse(res.begin(),res.end());
return res;
}
int main(){
int t;
cin>>t;
while(t--){
ll k;
cin>>k;
string strk=cgstr(k);
ll x=1;
int ans=10010;
for( int j=1;j<=64;j++){
string strx=cgstr(x);
int cnt=0,px=0;
for( int i=0;i<strk.size();i++){
if(strx[px]==strk[i]){
px++;
}
}
x*=2;
ans=min(ans,(int)strk.size()-px+(int)strx.size()-px);
}
cout<<ans<<endl;
}
}
E. Polycarp and String Transformation
#include<bits/stdc++.h>
using namespace std;
#define N 200100
typedef long long ll;
queue<int>st;//记录每个字母出现的顺序
queue<int>pre;
stack<int>ans2;//第二个问题的答案
int rem[30];//记录每个字母出现的次数
void ini(){
memset(rem,0,sizeof(rem));
while(!st.empty())st.pop();
while(!ans2.empty())ans2.pop();
while(!pre.empty()) pre.pop();
}
void print_ans(){
stack<int>temp;
while(!pre.empty()){
temp.push(pre.front());
pre.pop();
}
while(!temp.empty()){
cout<<(char)temp.top();
temp.pop();
}
cout<<" ";
while(!ans2.empty()) {
cout<<(char)ans2.top();
ans2.pop();
}
cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
string s;
cin>>s;
ini();
for( int i=s.size()-1;i>=0;i--){
if(rem[s[i]-'a'+1]==0){
st.push(s[i]);
ans2.push(s[i]);
}
rem[s[i]-'a'+1]++;
}
int cnt=st.size();
int ps=s.size()-1;
int flag=1;
for( int i=cnt;i>=1;i--){
int now=st.front();
st.pop();
int cnt1=rem[now-'a'+1]/i;
int next_size=(int)pre.size()+cnt1;
if(rem[now-'a'+1]%i!=0) flag=0;
for( int j=1;j<=next_size;j++){
if(s[ps]==now) cnt1--;
else{
if(pre.empty()){
flag=0;
break;
}
if(s[ps]!=(int)pre.front()){
flag=0;
break;
}
else {
pre.pop();
}
ps--;
}
if(!pre.empty()||flag==0||cnt1!=0){
flag=0;break;
}
for( int j=ps+next_size;j>=ps+1;j--){
pre.push(s[j]);
}
}
if(flag==0) {
cout<<-1<<endl;
}
else{
print_ans();
}
}
}
F2. Nearest Beautiful Number
从左到右逐个数字计算,直到k==0,此时分为两种情况,并假设当前位置为i
-
如果第i-1位不改变,那么后几位无论如何也不能成立。
-
如果第i-1位不改变,答案也可能成立
对于情况1,分为以下两种子情况(假设第i-1位为x):
1.1 把第i-1位改为x+1,且x+1未在以前出现过。那么就将剩下所有位都补0
1.2 改为x+1后,如果x+1在以前出现过,那么就把剩下的所有位都补为前面数字的最小值。对于情况2:
2.1 如果第i位取x而且后面答案仍然可以成立,第i位 就取x
并且重新进入情况2
2.2 如果第i位取x而后面答案不可能成立,那么第i位就取比x大的最小值,并且把后面补成所有已经出现的数的最小值。
#include<bits/stdc++.h>
using namespace std;
#define N 100100
int vis[20];
int n,k;
int check(vector<int> num,int pos){//如果没有没出现过的数1
for( int i=pos;i>=0;i--){
int u=num[i];
{
for( int j=u+1;j<=9;j++){
if(vis[j]==1){
return 1;
}
}
if(vis[u]==1) return check(num,i-1);
else return 0;
return 0;
}
}
return 1;
}
int solve (int n,int k){
vector<int>num;
memset(vis,0,sizeof(vis));
int temp=n;
int ans=0,minn=10;
while(temp) num.push_back(temp%10),temp/=10;
for( int i=num.size()-1;i>=0;i--){
int u=num[i];
if(k==0){
if(check(num,i)==1){
if(check(num,i-1)==1) {
if(vis[u]==1){
ans=ans*10+u;
}
else {
for( int j=u;j<=9;j++){
if(vis[j]==1){
ans=ans*10+j;
break;
}
}
int minn=10;
for( int j=0;j<=9;j++){
if(vis[j]==1){
minn=j;break;
}
}
for( int j=i;j>0;j--) ans=ans*10+minn;
return ans;
}
}
else{
for( int j=u+1;j<=9;j++){
if(vis[j]==1){
ans=ans*10+j;
break;
}
}
int minn=10;
for( int j=0;j<=9;j++){
if(vis[j]==1){
minn=j;break;
}
}
for( int j=i;j>0;j--) ans=ans*10+minn;
return ans;
}
}
else if(check(num,i)==0){
vis[ans%10]=0;
int u=ans%10+1;
ans=ans/10;
ans=ans*10+u;
if(vis[u]==1){
for( int j=i;j>=0;j--) ans=ans*10;
return ans;
}
else{
vis[u]=1;
int minn=10;
for( int j=0;j<=9;j++){
if(vis[j]==1){
minn=j;break;
}
}
for( int j=i;j>=0;j--) ans=ans*10+minn;
return ans;
}
}
}
else {
ans=ans*10+u;
if(vis[u]==0){
vis[u]=1;
k--;
}
}
}
return ans;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>k;
cout<<solve(n,k)<<endl;
}
}