总结和解题报告见:http://blog.csdn.net/woshi250hua/article/details/7913903
Zoj 3634代码和数据
#include <stdio.h>
#include <string.h>
#define MAX 110000
#define max(a,b) ((a)>(b)?(a):(b))
double ans,mon[MAX],att[MAX];
double x,y,tp,dpm[MAX],dpa[MAX];
int main()
{
int i,j,k,n;
while (scanf("%d%lf%lf",&n,&x,&y) != EOF) {
for (i = 1; i <= n; ++i)
scanf("%lf%lf",&mon[i],&att[i]);
if (n == 0) ans = x;
else {
dpa[n] = att[n];
dpm[n] = max(1.0/mon[n]*att[n],1);
for (i = n - 1; i >= 1; --i) {
dpa[i] = dpa[i+1] + dpm[i+1] * att[i];
tp = 1.0 / mon[i] * att[i] * dpm[i+1];
tp += dpa[i+1] * 1.0 / mon[i];
dpm[i] = max(tp,dpm[i+1]);
}
ans = x * dpm[1] + y * dpa[1];
}
printf("%.2lf\n",ans);
}
}
/*
#include <stdio.h>
#include <string.h>
#define MAX 110000
int n;
double x,y,sum[MAX],ans[MAX];
double a[MAX],b[MAX],dp[MAX];
int main()
{
int i,j,k;
double att,inc;
while (scanf("%d%lf%lf",&n,&x,&y) != EOF) {
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
for (i = 1; i <= n; ++i)
scanf("%lf%lf",&a[i],&b[i]);
for (i = n; i >= 0; --i)
sum[i] = sum[i+1] + b[i];
dp[0] = y;
ans[0] = x + y * sum[0];
for (i = 1; i <= n; ++i)
if (sum[i] > a[i] + 1e-12) {
double money = ans[i-1] - dp[i-1] * sum[i];//money
ans[i] = money / a[i] * sum[i] + dp[i-1] * sum[i];
dp[i] = dp[i-1] + money / a[i];
}
else {
dp[i] = dp[i-1];
ans[i] = ans[i-1];
}
printf("%.2lf\n",ans[n]);
}
}
3 1 1
1 1
1 1
1 1
1 10 0
1.0 1.0
3 13 5
7.0 1.0
1.1 0.6
1.0 0.6
*/
Zoj 3638 代码和数据
#include <stdio.h>
#include <string.h>
#define MAX (1<<17)
#define int64 long long
#define MOD 100000007
int64 ans;
int n,m,most[20],tot;
int Power(int x, int cf) {
if (cf == 0) return 1;
int64 ret = Power(x, cf >> 1);
ret = ret * ret % MOD;
if (cf & 1) ret = ret * x % MOD;
return ret;
}
int64 mulrev(int x) {
int64 ans = 1, tmp = x;
for (int y = MOD - 2; y; y >>= 1) {
if (y & 1) ans = (ans * tmp) % MOD;
tmp = (tmp * tmp) % MOD;
}
return ans;
}
int64 C(int m, int n) {
if (n < 0 || n > m || m < 0) return 0;
int64 up = 1;
int64 down = 1;
int i;
for (i = m - n + 1; i <= m; i++) up = up * i % MOD;
for (i = 1; i <= n; i++) down = down * i % MOD;
return up * Power(down, MOD - 2) % MOD;
}
int64 Cal(int n,int m) {
if (m > n || m < 0 || n < 0) return 0;
if (m > n - m) m = n - m;
int64 suma = 1,sumb = 1;
for (int i = 1; i <= m; ++i) {
sumb = (sumb * i) % MOD;
suma = (suma * (n - i + 1)) % MOD;
}
int64 tp = suma * mulrev(sumb) % MOD;
//printf("C(%d,%d) = %lld\n",n,m,tp);
return tp;
}
int64 Solve(int m) {
int i,j,k,sum,cnt;
for (i = 0; i < (1<<tot); ++i) {
sum = cnt = 0;
for (j = 0; j < tot; ++j)
if ((i>>j) & 1) sum += most[j],cnt++;
sum = C(m-sum,n-1);//Cal(m-sum,n-1);
if (!(cnt & 1)) ans = (ans + sum) % MOD;
else ans = (ans - sum + MOD) % MOD;
}
return ans;
}
void Dfs(int in,int sum,int cnt) {
if (sum < 0) return;
if (in == tot) {
if (cnt & 1) ans = (ans - Cal(sum,n-1) + MOD) % MOD;
else ans = (ans + Cal(sum,n-1) + MOD) % MOD;
return ;
}
Dfs(in+1,sum,cnt);
Dfs(in+1,sum-most[in],cnt+1);
}
int main()
{
int i,j,k;
char str[200],s1[200],s2[200],s3[200];
while (scanf("%d%d",&n,&m),n) {
gets(str);
ans = tot = 0;
bool flag = true;
for (i = 0; i <= n; ++i) {
if (!gets(str)) break;
if (strlen(str) < 2) break;
sscanf(str,"%s %s %s %d",s1,s2,s3,&k);
if (s2[0] == 'g') m -= k + 1;
else {
most[tot++] = k;
if (k <= 0) flag = false;
}
}
ans = 0;
if (flag) ans = Solve(m+n-1);//Dfs(0,m+n-1,0);
printf("%lld\n",ans);
}
}
/*
2 5
apple: less than 1
peach: greater than 1
1 18
apple: less than 0
4 10
fan: less than 1
rou: less than 7
tang: less than 6
cai: greater than 4
*/
Zoj 3640 代码和数据
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define MAX 20000
double dp[MAX], ans;
int c[MAX], vis[MAX];
int n, m, cost[MAX];
void Solve_DP() {
memset(dp, 0, sizeof (dp));
for (int i = 2 * c[n]; i >= m; --i) {
for (int j = 1; j <= n; ++j)
if (i > c[j]) dp[i] += cost[j];
else dp[i] += 1 + dp[c[j] + i];
dp[i] /= n;
}
}
double Calculate(int att) {
if (vis[att])
return dp[att];
vis[att] = 1;
dp[att] = 0;
for (int i = 1; i <= n; ++i)
if (att > c[i])
dp[att] += cost[i];
else dp[att] += Calculate(att+c[i]) + 1;
dp[att] /= n;
return dp[att];
}
int main() {
int i, j, k;
while (scanf("%d%d", &n, &m) != EOF) {
for (i = 1; i <= n; ++i)
scanf("%d", &c[i]);
sort(c + 1, c + 1 + n);
for (i = 1; i <= n; ++i)
cost[i] = (1 + sqrt(5)) / 2 * c[i] * c[i];
//Solve_DP();
//printf("%.3lf\n", dp[m]);
memset(vis,0,sizeof(vis));
ans = Calculate(m);
printf("%.3lf\n",ans);
}
}
Zoj 3641 代码和数据
#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 110000
int n,m,tot,fa[MAX];
map<string,int> mmap;
set<int> ver[MAX];
void Initial() {
tot = 0;
mmap.clear();
for (int i = 1; i <= n; ++i)
fa[i] = i,ver[i].clear();
}
int GetPa(int x) { //获取x点的父亲,并进行路径压缩
int p = x,tp;
while (p != fa[p]) p = fa[p];
while (x != p) {
tp = fa[x];
fa[x] = p,x = tp;
}
return p;
}
void UnionSet(int x,int y) { //将y属于的集合和x属于的集合合并
int px = GetPa(x);
int py = GetPa(y);
if (px == py) return;
if (px > py) swap(px,py);
fa[px] = py;
multiset<int>::iterator it;
for (it = ver[px].begin(); it != ver[px].end(); ++it)
ver[py].insert(*it); //合并时子节点也需要合并
ver[px].clear();
}
int main()
{
int i,j,k,a,b;
char ope[100],name[100],name1[100];
while (scanf("%d",&n) != EOF) {
Initial();
for (i = 1; i <= n; ++i) {
scanf("%s",ope);
if (ope[0] == 'a') {
scanf("%s",name);
if (mmap.find(string(name)) == mmap.end())
mmap[string(name)] = ++tot;
scanf("%d",&k);
for (j = 1; j <= k; ++j) {
scanf("%d",&a);
ver[tot].insert(a);
}
}
else if (ope[0] == 's') {
scanf("%s%s",name,name1);
a = mmap[name],b = mmap[name1];
UnionSet(a,b);
}
else {
scanf("%s",name);
a = mmap[name];
printf("%d\n",ver[GetPa(a)].size());
}
}
}
}
Zoj 3643代码和数据
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX 600000
struct node {
int v,pre;
node *next;
}*head[MAX],tree[MAX];
int ptr,n,m,ans,len,next[MAX];
char s1[MAX],str[MAX];
void Initial() {
ptr = ans = 0;
memset(head,NULL,sizeof(head));
}
void GetNext() {
int i = 0,j = - 1;
next[0] = -1;
while (i < n) {
if (j == -1 || s1[i] == s1[j])
i++,j++,next[i] = j;
else j = next[j];
}
}
int Solve_KMP() {
int i,j,k;
i = j = ans = 0;
while (i < len) {
if (j == -1 || str[i] == s1[j]) {
i++,j++;
head[i] = head[i-1];
if (j == n) {
ans ++;
if (head[i] != NULL)
j = head[i]->v,head[i] = head[i]->next;
else j = 0;
}
}
else {
tree[i].v = j;
tree[i].next = head[i];
head[i] = &tree[i];
j = next[j];
}
}
return ans;
}
int main()
{
int i,j,k;
char c;
while (scanf("%s",s1) != EOF) {
Initial();
n = strlen(s1);
GetNext();
scanf("%s",str);
len = strlen(str);
ans = Solve_KMP();
printf("%d\n",ans);
}
}
/*
aba
abaaabaabbaa
abcd
abcabcddabcdababcdcd
abcd
abcabcddababcdabcddd
*/
本文ZeroClock原创,但可以转载,因为我们是兄弟。