整理(六)——习题4

6 篇文章 0 订阅

搜索

1、选数 P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <iostream>
#include <cmath>
using namespace std;
int n,k,a[35000],ans=0;
int isPrime(int h)
{
 for(int i=2;i<=sqrt(h);i++)
  {if(h%i==0)
    return 0;}
  return 1;
}
void dfs(int q, int z,int sum)
{
    if(z==k)
    {
        if(isPrime(sum)==1) ans++;
        return ;
    }
    if(q==n+1)
    return ;
    dfs(q+1,z+1,sum+a[q]);
    dfs(q+1,z,sum);
}
int main()
{
    cin>>n>>k;
    int i;
    for(i=1;i<=n;i++)
    cin>>a[i];
    dfs(1,0,0);
    cout<<ans;
}

(使用bool函数一直wrong answer  (ㄒoㄒ))

输入案例:

4 3
3 7 12 19

输出:

1

2、求细胞数量:P1451 求细胞数量 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<iostream>
using namespace std;
int ans;
int dr[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool b[105][105];
void search(int x,int y)
{
    b[x][y]=false;
    for(int i=0;i<4;i++)
    {
        int nx=x+dr[i][0],ny=y+dr[i][1];
        if(b[nx][ny])search(nx,ny);
    }
}
int main()
{
    int n,m;
    char k;
    cin>>m>>n;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>k;
            if(k!='0')b[i][j]=true;
        }
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(b[i][j])
            {
                search(i,j);
                ans++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

输入案例:

4 10
0234500067
1034560500
2045600671
0000000089

输出:

4

3、植树:P6591 [YsOI2020]植树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>
using namespace std;
vector <int> es[1000000+100];
bool root[1000000+100];
int d[1000000+100],n;
int dfs(int x,int father)
{
	int size1 = es[x].size(),num = 0;
	root[x] = 1;
	for(int i=0;i<=size1-1;i++)
		if(es[x][i] != father)
		{
			d[x] += dfs(es[x][i],x);
			if(!num)
				num = d[es[x][i]];
			if(num != d[es[x][i]])
                root[x] = 0;
		}
	++d[x];
	if(x != 1 && num && num != n - d[x])
        root[x] = 0;
	return d[x];
}
int main()
{
	cin>>n;
	int a,b;
	for(int i=1;i<=n-1;i++)
	{
		cin>>a>>b;
		es[a].push_back(b);
		es[b].push_back(a);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)
		if(root[i])
           cout<<i<<" ";
           cout<<endl;
	return 0;
}

输入案例:

4
1 2
2 3
3 4

输出:

1 4 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值