首页 > 编程语言 >挑战程序设计竞赛 2.1章习题 poj 3046 Ant Counting

挑战程序设计竞赛 2.1章习题 poj 3046 Ant Counting

时间:2024-05-18 21:41:08浏览次数:39  
标签:const 蚂蚁 int ants Ant poj 习题 dp 1000

https://vjudge.net.cn/problem/POJ-3046#author=GPT_zh

有一天,贝西在蚂蚁山里探头探脑,看着蚂蚁们来来回回地觅食。
她发现很多蚂蚁都是兄弟姐妹,彼此无法区分。
她还发现,有时只有一只蚂蚁去觅食,有时几只,有时全部。
这就产生了大量不同组合的蚂蚁!

有点数学天赋的贝茜开始琢磨起来。贝西注意到,蜂巢里有 T(1 <= T <= 1,000)个蚂蚁家庭,
她把它们标为 1...T(共有 A 只蚂蚁)。
每个家庭有一定数量的蚂蚁 Ni (1 <= Ni <= 100)。

可以组成多少个大小为 S、S+1、......、B(1 <= S <= B <= A)的小组?

在观察一个蚂蚁群时,可以看到三个蚂蚁家族的集合是{1, 1, 2, 2, 3},但很少按这个顺序排列。
蚂蚁行进的可能集合是

有 1 只蚂蚁的 3 个集合: {1} {2} {3}
有 2 只蚂蚁的 5 组 {1,1} {1,2} {1,3} {2,2} {2,3}
有 3 只蚂蚁的 5 组 {1,1,2} {1,1,3} {1,2,2} {1,2,3} {2,2,3}
有 4 只蚂蚁的 3 组 {1,2,2,3} {1,1,2,2} {1,1,2,3}
有 5 只蚂蚁的 1 组 {1,1,2,2,3}

你的任务是根据上述数据计算可能的蚂蚁集合数。
输入
* 第 1 行:4 个空格分隔的整数: T、A、S 和 B

* 第 2...A+1 行:每行包含一个整数,即蜂巢中存在的蚂蚁类型
输出
* 第 1 行: 可创建的大小为 S...B(包括 S...B)的集合数量。像 {1,2} 这样的集合与 {2,1} 这样的集合相同,不应重复计算。
只打印该数字的后六位,不打印前导零或空格。

3 5 2 3
1
2
2
1
3

10


提示
输入细节:
三种类型的蚂蚁(1...3);共有 5 只蚂蚁。可以制作多少套大小为 2 或 3 的蚂蚁?

输出细节:
5 组有两名成员的蚂蚁;另外 5 组有三名成员的蚂蚁

解答
dp

代码如下:

#include <iostream>

using namespace std;


const int N = 1000 * 100 + 10;
int dp[1000][N];
int ants[N];
int T, S, A, B;
const int MOD = 1000000;

void solve() {
	dp[0][0] = 1;

	for (int i = 1; i <= T; i++) {
		for (int j = 0; j <= A; j++) {
			for (int k = 0; k <= ants[i]; k++) {
				if (j >= k) {
					dp[i][j] += dp[i - 1][j - k];
					dp[i][j] %= MOD;
				}
			}
		}
	}

	long long  ans = 0;
	for (int i = S; i <= B; i++) {
		ans += dp[T][i];
		ans %= MOD;
	}
	cout << ans << endl;

	return;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> T >> A >> S >> B;

	for (int i = 1; i <= A; i++) {
		int t; cin >> t;
		ants[t]++;
	}

	solve();

	return 0;
}

在POJ能ac 但是可能是数据太弱的原因。
A在极端取值 1000组蚂蚁 每个蚂蚁都是100个。 那么A=100000
上面的代码 耗时就是O(AT100) 就是1e10 会超时的。
下面进行优化

#include <iostream>

using namespace std;


const int N = 1000 * 100 + 10;
int dp[1000][N];
int ants[N];
int T, S, A, B;
const int MOD = 1000000;

void solve() {
	dp[0][0] = 1;

	for (int i = 1; i <= T; i++) {
		for (int j = 0; j <= A; j++) {
			if (j == 0) { dp[i][j] = 1; }
			else if (j  >= ants[i]+1) {
				dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - ants[i]-1];
			}
			else {
				dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
			}
			dp[i][j]  %= MOD;
		}
	
	}

	long long  ans = 0;
	for (int i = S; i <= B; i++) {
		ans += dp[T][i];
		ans = (ans + MOD) % MOD;
	}
	cout << ans << endl;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> T >> A >> S >> B;

	for (int i = 1; i <= A; i++) {
		int t; cin >> t;
		ants[t]++;
	}

	solve();

	return 0;
}

我的视频题解空间

标签:const,蚂蚁,int,ants,Ant,poj,习题,dp,1000
From: https://www.cnblogs.com/itdef/p/18199805

相关文章

  • ctflearn-writeup(Exclusive Santa)
    https://ctflearn.com/challenge/851在完成这题前最好先下载foremost,unrar,stegsolve等工具首先拿到题目后,先解压得到两个图片文件1.png和3.png两张图片用exiftool,strings,binwalk试过后发现无解于是用关键命令foremost3.png-T(修复破损文件)发现有一个output的文件夹......
  • 挑战程序设计竞赛 2.2章习题 POJ - 3617 Best Cow Line 贪心
    FJ正准备带着他的N头奶牛(1≤N≤2,000)参加一年一度的“年度最佳农民”比赛。在这个比赛中,每个农民都会将他的奶牛排成一行,然后引导它们经过评委。今年比赛的组织者采用了一种新的注册方案:只需按照它们出现的顺序注册每头奶牛的首字母(即如果FJ带着Bessie、Sylvia和Dora依次出......
  • poj 3061 Subsequence
    题目链接:来自罗勇军《算法竞赛》书中的习题。题意:给长度为\(N\)的数组和一个整数\(S\),求总和不小于\(S\)的连续子序列的最小长度。方法一:尺取法主要思想为:当\(a_1,a_2,a_3\)满足和\(\geqslantS\),得到一个区间长度\(3\),那么去掉开头\(a_1\),剩下\(a_2,a_3\)......
  • Games101-4 antialiasing and z-buffer
    利用中心对三角形进行采样antialiasing反走样samplingartifact--图形学中一切不好的东西空间,时间采样问题---信号的速度快导致采样跟不上如何做:在采样之前进行模糊/滤波,然后进行采样--不能反过来正弦和余弦滤波--好处:参数不同频率不同---每隔多少就重复一次......
  • antd-vue 时间选择器限制, 选择不超过七天的范围,且默认时间为当前时间往后七天
    1.template代码<a-range-picker v-model:value="conversationTime" style="margin-right:20px" :disabledDate="disabledDate" @calendarChange="onCalendarChange" @change="onChange" @openChange......
  • WindowsBaselineAssistant Windows安全基线核查加固助手,WindowsBaselineAssistant Wi
    GitHub-DeEpinGh0st/WindowsBaselineAssistant:Windows安全基线核查加固助手WindowsBaselineAssistantWindows安全基线核查加固助手,WindowsBaselineAssistantWindowsBaselineAssistant(WBA)是一个用于检测和加固Windows安全基线的辅助工具,借助此工具你可以免去繁琐的......
  • AoPS - Chapter 24 Diophantine Equations
    这一节主要讲解了二元一次丢番图方程、本原勾股数、佩尔方程(ThePellEquation)。丢番图方程(Diophantineequation)是指未知数为整数的整数系数多项式等式。(丢番图方程-维基百科)二元一次丢番图方程关于\(x,y\)的形如\(ax+by=c\)的丢番图方程称为二元一次丢番图方程。求解......
  • Java-并发-ReentrantLock
    0.是什么ReentrantLock是java.util.concurrent.locks包中的一个类,提供了比synchronized关键字更灵活和强大的锁机制。ReentrantLock实现了Lock接口,它允许显式地加锁和解锁,并提供了一些高级功能,如中断锁请求、超时锁请求、公平锁和非公平锁选择等。1.为什么在Java诞生......
  • vue-cli项目处理vant自适应问题
    原因vant自带的样式,用的单位是px,无法自适应。一般有两种处理思路。一、写媒体查询安装插件postcss-pxtorem:用于将单位px转化为rem//安装命令npmi-Dpostcss-pxtoremlib-flexible:给html标签设置font-size,作为rem基准值(因为我的项目已经脚本处理了,所以我是没有......
  • shell脚本习题
    目录1.计算1到100所有整数的和2.提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和3.求从1到100所有整数的偶数和、奇数和4.用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密吗,则提示用户并让用户设置......