做题小结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

posted @ 2025-04-16 19:45  LteShuai  阅读(4)  评论(0)    收藏  举报