A.回文时间
签到题,一开始看到回文串想到马拉车,后来发现枚举就行。不太常用printf,所以输出不太简洁。 (printf 可以用 %0xd 自动补前置 0 , x 是位数
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
string m[6]={"01","02","10","11","12"};
string rm[6]={"10","20","01","11","21"};
int minu,sec;
bool check(int y, int i){
if (y==2020 && i==0) return false;
int k=y%100;
minu=(k%10)*10+(k-k%10)/10;
int t=(y-k)/100;
sec=(t%10)*10+(t-t%10)/10;
if (minu>=0 && minu<60 && sec>=0 && sec<60)
return true;
else return false;
}
int main() {
ios::sync_with_stdio(false);
int n;
cin>>n;
if (n==0) cout<<"20200122100202";
else {
int cnt=0;
for (int y=2020; y<=9595; y++) {
for (int i=0; i<=4; i++) {
for (int d=11; d<=22; d+=11) {
if (check(y,i)) cnt++;
if (cnt==n) {
cout<<y<<m[i]<<d<<rm[i];
if (minu<10) cout<<"0"<<minu;
else cout<<minu;
if (sec<10) cout<<"0"<<sec;
else cout<<sec;
break;
}
}
}
}
}
return 0;
}
B.构树挑战
待补
C.最简边集
待补
D.对称变量
待补
E.数的变幻
x -变幻序列的生成方式,在二进制的意义下,无非就是:
- 末尾为 1 ,则变成 0 ;
- 末尾为 0 ,则直接去掉。
统计x出现的次数:
- x是奇数,那么x必定在2x,2x+1出现,同理在4x,4x+1,4x+2,4x+3中出现,…(注意x在自己本身算一次)
- x数偶数,在x+1出现,在2x,2x+1,2x+2,2x+3中出现,…(在偶数情况下,可将x+1)
如果将奇数和偶数独立开来考虑的话,是满足单调性的。
考虑对奇数和偶数分别二分确定最大值,然后取两者中的较大值作为答案即可。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
ll n,k;
bool check(ll x) {
ll cnt=0;
ll l=x;
ll r=x&1?x:x+1;
while (l<=n) {
cnt+=min(n,r)-l+1; //在区间中连续出现,右端减去左端,再加上自己
l<<=1;
r<<=1;
r++;
}
return cnt>=k;
}
int main() {
ios::sync_with_stdio(false);
int T;
cin>>T;
while (T--) {
cin>>n>>k;
ll l=1,r=(n+1)/2;
ll ans1=1;
while (l<=r) {
ll mid=(l+r)>>1;
if (check(mid*2-1)) {
ans1=mid*2-1;
l=mid+1;
} else r=mid-1;
}
l=1,r=n/2;
ll ans2=0;
while (l<=r) {
ll mid=(l+r)>>1;
if (check(mid*2)) {
ans2=mid*2;
l=mid+1;
} else r=mid-1;
}
ll ans=max(ans1,ans2);
cout<<ans<<endl;
}
return 0;
}