做题小结1
第一道题目
题目

我当时的做法是每个大于k的/k 然后得到余数 对于小于k的变成负数
然后进行双指针 后面如果剩了Z正的就两两合并 这种做法没问题 就是麻烦点 我们实际上对于那些余数 反正都是小于k 就直接弄在一起 合并就行了 管那么多干什么
while (l < r && r) {
if(a[r] + a[l] >= k) {
//贪心
ans += 1;
// cout<<a[r]<<" "<<a[l]<<endl;
// cout<<r<<" "<<l<<" "<<ans<<endl;
l++;
r--;
} else {
l++;
}
}
第二个题目

说实话做不来 后面看题解才知道找10 中间的都是有可能小偷 然后头尾插1 0 防止没有这种情况
void solve() {
cin >> s;
int len = s.size();
s = '1' + s;
s = s + '0';
int st = 0;
int las = len + 1;
for (int i = 1; i <= len+1; i++) {
if (s[i] == '1'&&i!=0) {
st = i;
}
}
for (int i = 0; i < len+1; i++) {
if (s[i] == '0'&&i!=len+1) {
las = i;
break;
// cout<<i<<" "<<"ss"<<endl;
}
}
int num=0;
if(las==len+1)
num++;
if(st==0)num++;
cout<<las-st+1-num<<endl;
}

这个题 我是读了好几遍了 都没看到 那个输出是真没读懂
m对,这个翻译也是服了
后面去b站看视频才看懂
树链刨分
然后这个题 叶子节点多少个 多少条路径 然后从上往下输出即可 还是挺好玩的
for(int i=1;i<=n;i++)
{
if(fa[i]==0)
{
vector<int>v;
int x=i;
while(vis[x]==0)
{
v.push_back(x);
vis[x]=1;
x=a[x];
}
cout<<v.size()<<endl;
//可以reverse 也可以倒序
for(auto it=v.end()-1;it!=v.begin()-1;it--)
{
cout<<*it<<" ";
}
cout<<endl;
}
第四个
题目
呃
其实就是按顺序找吧 写一个递归 然后贪心的去找一个最大的字母可以和第一个字母一起变a 没什么说的
注意那个递归的money一直取最大的就行了
链接错了 懒得找了 4.20 25

浙公网安备 33010602011771号