板凳分配问题

yg_zhu 2019-11-29 09:04:21
求解算法问题
将板凳0与小朋友1任意排列,每个小朋友可以坐离其距离范围为k的任意一个板凳,每个人只能坐一个板凳,有多少个小朋友能坐到板凳?
如下输入输出:
input 101100,k=2

output :3
...全文
58 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2019-11-30
粗想了一下,觉得用贪心算法可以解决:

计数器初始为0
输入 str 和 k
len = str的长度
用i对str的每个字符做循环 {
如果str第i个元素值是‘2’ 继续i的循环;
用j对i+1到i+k并且满足j小于len的str里面的字符做循环 {
如果str的第j个元素和第i个元素能0/1配对
str的第j个元素值设为为'2', 计数器加一, 退出第二重循环
}
}
输出计数器
回复
yg_zhu 2019-11-30
引用 2 楼 寻开心 的回复:
粗想了一下,觉得用贪心算法可以解决: 计数器初始为0 输入 str 和 k len = str的长度 用i对str的每个字符做循环 { 如果str第i个元素值是‘2’ 继续i的循环; 用j对i+1到i+k并且满足j小于len的str里面的字符做循环 { 如果str的第j个元素和第i个元素能0/1配对 str的第j个元素值设为为'2', 计数器加一, 退出第二重循环 } } 输出计数器
非常感谢
回复
yg_zhu 2019-11-30
引用 4 楼 寻开心 的回复:
前面的凳子由前面的凳子匹配后面的人; 前面的人和后面的凳子匹配。 这个配对是这个意思。 遇到不是2的0,去寻找第一个和他匹配的1; 遇到1去找第一个和他匹配的0; #include<stdio.h> #include <string.h> int main() { char str[100]; int k; scanf("%s%d", str, &k); int len = strlen(str); int i, j, count=0; for (i=0; i<len-1;i++ ) { if (str[i] > '1' ) continue; for ( j=i+1; i<len && j-i<=k; j++ ) { if ( str[j] > '1' ) continue; if ( str[i] ^ str[j] ) { str[j]='A'+count; str[i]='A'+count; count++; break; } } } printf("%s %d\n", str, count); return 0; } 试试能不能找到反例
您好,我用您上面说的思路,另开一个vector存储孩子和凳子的标签(孩子为-1,凳子为0),分别查找当前孩子前后K个位置的凳子,凳子被占用置-1

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std ;

int main()
{
	vector<char> str_ck;
	vector<int> lable;
	string s1;
	char num;
	int lab_chair = 0;
	int lab_child = -1;
	int k;
	int len;
	int ans = 0;
	cin >> s1;
	for (int p = 0; p < s1.length(); p++)
	{
		str_ck.push_back(s1[p]);
		if(s1[p]=='1')
            lable.push_back(lab_child);
        else
            lable.push_back(lab_chair);
	}
	cin >> k;
	len = str_ck.size()-1;
	for (int i = 0; i < str_ck.size(); i++)
	{
		if (str_ck[i]=='1')
		{
			for (int j = max(0,i-k); j <= min(len,i+k); j++)
			{
				if(str_ck[j]=='0'&&lable[j]==0)
				{
					ans++;
					lable[j]=-1;
					break;
				}

			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
回复
寻开心 2019-11-30
前面的凳子由前面的凳子匹配后面的人; 前面的人和后面的凳子匹配。 这个配对是这个意思。
遇到不是2的0,去寻找第一个和他匹配的1; 遇到1去找第一个和他匹配的0;

#include<stdio.h>
#include <string.h>
int main()
{
char str[100];
int k;
scanf("%s%d", str, &k);
int len = strlen(str);
int i, j, count=0;
for (i=0; i<len-1;i++ ) {
if (str[i] > '1' ) continue;
for ( j=i+1; i<len && j-i<=k; j++ ) {
if ( str[j] > '1' ) continue;
if ( str[i] ^ str[j] ) {
str[j]='A'+count; str[i]='A'+count; count++; break;
}
}
}
printf("%s %d\n", str, count);
return 0;
}

试试能不能找到反例
回复
lin5161678 2019-11-30
引用 2 楼 寻开心 的回复:
粗想了一下,觉得用贪心算法可以解决:

计数器初始为0
输入 str 和 k
len = str的长度
用i对str的每个字符做循环 {
如果str第i个元素值是‘2’ 继续i的循环;
用j对i+1到i+k并且满足j小于len的str里面的字符做循环 {
如果str的第j个元素和第i个元素能0/1配对
str的第j个元素值设为为'2', 计数器加一, 退出第二重循环
}
}
输出计数器
应该不对 有时候 需要坐前面的凳子
你的算法没机会做前面的凳子
需要做前面凳子的小孩没算进去
回复
发帖
其它技术问题
创建于2007-09-28

3842

社区成员

C/C++ 其它技术问题
申请成为版主
帖子事件
创建了帖子
2019-11-29 09:04
社区公告
暂无公告