ZOJ Monthly, August 2012 部分代码和数据

总结和解题报告见: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原创,但可以转载,因为我们是兄弟。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值