好吧,因为USACO挂掉了,所以我写的所有代码都不保证正确性【好的,这么简单的题,再不写对,你就可以滚粗了!
第一题是USACO 2.2.2
★Subset Sums 集合
对于从 1 到 N 的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的.
举个例子,如果 N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:
{3} and {1,2} 26
这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)
如果 N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:
{1,6,7} and {2,3,4,5} {注 1+6+7=2+3+4+5}
{2,5,7} and {1,3,4,6}
{3,4,7} and {1,2,5,6}
{1,2,4,7} and {3,5,6}
给出 N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出 0.程序不能预存结果
直接输出.
PROGRAM NAME: subset
INPUT FORMAT
输入文件只有一行,且只有一个整数 N
SAMPLE INPUT (file subset.in)
7
OUTPUT FORMAT
输出划分方案总数,如果不存在则输出 0.
SAMPLE OUTPUT (file subset.out)
4
——分割线——
这道题其实就是一个背包,就是求用1~n组合成(n+1)*n/4的方案数。我们记f[x]表示组成和为x我们的方案数,我们尝试每个数k,从(n+1)*n/4开始到k即为p寻找一旦p-k这个值可以通过1~k-1这些数组成,即f[p-k]!=0。那么,我们就使f[p]+=f[p-k],即每个可以组成p-k的方案在加上一个k就可以组成p的方案。
/*Author:WNJXYK*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
#define LL long long
inline void swap(int &x,int &y){int tmp=x;x=y;y=tmp;}
inline void swap(LL &x,LL &y){LL tmp=x;x=y;y=tmp;}
inline int remin(int a,int b){if (a<b) return a;return b;}
inline int remax(int a,int b){if (a>b) return a;return b;}
inline LL remin(LL a,LL b){if (a<b) return a;return b;}
inline LL remax(LL a,LL b){if (a>b) return a;return b;}
const int Maxn=2000;
int n;
int Sum=0;
int f[Maxn+10];
int main(){
scanf("%d",&n);
Sum=(n+1)*n/2/2;
f[0]=1;
for (int i=n;i>=1;i--){
for (int j=Sum;j>=i;j--){
f[j]=f[j]+f[j-i];
}
}
printf("%d\n",f[Sum]/2);
return 0;
}
第二题是USACO 2.3.1
★Longest Prefix 最长前缀
在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列 28
分解成较短的(称之为元素的)序列很感兴趣.
如果一个集合 P 中的元素可以通过串联(允许重复;串联,相当于 Pascal 中的 “+” 运算符)
组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.并不是所有的元素都必须出现.
举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素:
{A, AB, BA, CA, BBC}
序列 S 的前面 K 个字符称作 S 中长度为 K 的前缀.设计一个程序,输入一个元素集合以及一个
大写字母序列,计算这个序列最长的前缀的长度.
PROGRAM NAME: prefix
INPUT FORMAT
输入数据的开头包括 1..200 个元素(长度为 1..10 )组成的集合,用连续的以空格分开的字符串
表示.字母全部是大写,数据可能不止一行.元素集合结束的标志是一个只包含一个 “.” 的行.集
合中的元素没有重复.接着是大写字母序列 S ,长度为 1..200,000 ,用一行或者多行的字符串来表
示,每行不超过 76 个字符.换行符并不是序列 S 的一部分.
SAMPLE INPUT (file prefix.in)
A AB BA CA BBC
ABABACABAABC
OUTPUT FORMAT
只有一行,输出一个整数,表示 S 能够分解成 P 中元素的最长前缀的长度.
SAMPLE OUTPUT (file prefix.out)
11
——分割线——
这道题我也没仔细想,脑不了个方法写出啦就好了