一道数论构造,一道字符串。
数论构造没有递推,想的算法复杂度太大了,没写。
字符串判断成环错误,其他简单
B. Ela’s Fitness and the Luxury Number
题目大意: [ l, r ] 两个边界,判断有几个奢侈数。
奢侈数定义: A % [ (int) sqrt(A) ] == 0 ;;; [] 向下取整
分析: 每一个数最多有三个奢侈数
A, t = [ sqrt(A) ] ,
A >= tt + t
A >= tt + t2
A >= tt
void solve() {
// 函数 -- 得到x有几个奢侈数;;
auto getl = [] (LL x) {
LL t = sqrt(x);
// 可能有精度损失,判断 t方 大于 x时, -- t;
if(t * t > x) --t;
// res 1 到 x 有几个奢侈数
LL res = (t-1)*3;
// 1
if(x >= t*t) res++;
// 2
if(x >= t*t + t*1) res++;
// 3
if(x >= t* t + t* 2) res++;
return res;
};
LL l, r; cin>>l>>r;
cout<<getl(r) - getl(l-1)<<endl;
}
C. Phase Shift
题目大意: 26个字母按连成一个环,每次顺时针向前。
分析:刚开始用unordered_map<char,char> 判断是否成环,但是我只判断了与头位置的部分,但是没有判断其他位置的部分。看了别人的题解,发现用并查集可以判断加入是否成环。
void cir() {
y
if(find(x) == find(y)) isCir;
else {
insert(p[x] = y);
}
}
void solve() {
// char(0) == '\0'
memset(c, 0, sizeof(c));
memset(p, 0, sizeof(p));
rep(i,'a', 'z') p[i] = char(i);
int n; string str; cin>>n>>str;
int cnt = 0;
for(auto ch: str) {
if(c[ch] != char(0)) {
cout<<c[ch]; continue;
}
for(char j = 'a'; ; ++j) {
// j 大于 'z' 时,j 就为 'a'
if(j == 'z' + 1) j = 'a';
// 判断是否成环,cnt 要小于 25
if(find(j) == find(ch) && cnt < 25) continue;
// 不相等,即不自环。无操作。
if(j != ch && c[ch] == char(0) && p[j] == j) {
p[j] = ch; // 尾环
c[ch] = j;
cnt++;
cout<<c[ch];
break;
}
}
}
puts("");
}```