您的位置:首页 > 大数据 > 人工智能

2015 Multi-University Training Contest 9(hdu 5396 - hdu 5405)

2015-08-27 10:27 591 查看

1.Expression

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5396

解题思路:/article/1958530.html

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

typedef long long ll;
const int MOD = 1e9+7;
const int maxn = 100;
ll c[maxn+5][maxn+5],f[maxn+5];
ll dp[maxn+5][maxn+5];
char op[maxn+5];

void init(){
    for(int i = 0; i <= maxn; i++){
        c[i][0] = c[i][i] = 1;
        for(int j = 1; j <= i; j++)
            c[i][j] = (c[i-1][j]+c[i-1][j-1])%MOD;
    }
    f[0] = 1;
    for(int i = 1; i <= maxn; i++)
        f[i] = f[i-1]*i%MOD;
}

int main () {
    init ();
    int n;
    while (~scanf("%d",&n)) {
        memset(dp, 0, sizeof(dp));
        for (int i = 0; i < n; i++)
            scanf("%d", &dp[i][i]);
        getchar();
        gets(op);
        for (int i = n-1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) {
                int len = j - i - 1;
                for (int k = i; k < j; k++) {
                    int l = k - i, r = j - k - 1;

                    ll ret = 0;
                    if (op[k] == '+') {
                        ret = (ret + dp[i][k] * f[r]) % MOD;
                        ret = (ret + dp[k+1][j] * f[l]) % MOD;

                    }
                    else if (op[k] == '-') {
                        ret = (ret + dp[i][k] * f[r]) % MOD;
                        ret = ((ret - dp[k+1][j] * f[l]) % MOD + MOD) % MOD;
                    }
                    else if (op[k] == '*')
                        ret = dp[i][k] * dp[k+1][j] % MOD;
                    dp[i][j] = (dp[i][j] + ret * c[len][l]) % MOD;
                }
                //printf("%d %d: %d\n", i, j, dp[i][j]);
            }
        }
        printf("%lld\n", dp[0][n-1]);
    }
    return 0;
}


2.Hack it!

3.GCD Tree

4.Too Simple

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5399

解题思路:/article/1958499.html

AC代码:

#include <iostream>    
#include <cstdio>    
#define MOD 1000000007    
using namespace std;    
typedef long long ll;    
int n,m;    
ll f[105],a[105][105];    
    
int main(){    
    f[0] = 1;    
    for(int i = 1; i <= 100; i++)    
        f[i] = f[i-1]*i%MOD;    
    while(~scanf("%d%d",&n,&m)){    
        ll tot = 0,ans = 1;    
        for(int i = 1; i <= m; i++){    
            scanf("%lld",&a[i][1]);    
            if(a[i][1] == -1)    
                tot++;    
            else{    
                for(int j = 2; j <= n; j++){    
                    scanf("%lld",&a[i][j]);    
                    for(int k = j-1; k >= 1; k--)    
                        if(a[i][j] == a[i][k])    
                            ans = 0;    
                }    
            }    
        }    
        for(int i = 1; i < tot; i++)    
            ans = ans*f
%MOD;    
        if(tot == 0){    
            for(int i = 1; i <= n; i++)    
                a[0][i] = i;    
            for(int i = m; i>= 1; i--)    
                for(int j = 1; j <= n; j++)    
                    a[0][j] = a[i][a[0][j]];//映射转换  
            for(int i = 1; i <= n; i++)    
                if(a[0][i] != i)    
                    ans = 0;//如果不能变回原来的数列,则为0  
        }    
        printf("%lld\n",ans);    
    }    
    return 0;    
}


5.Arithmetic Sequence

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5400

解题思路:/article/1958500.html

AC代码:

#include <iostream>  
#include <cstdio>  
using namespace std;  
  
typedef long long ll;  
int a[100005];  
ll l[100005],r[100005];  
  
int main(){  
    int n,d1,d2;  
    while(~scanf("%d%d%d",&n,&d1,&d2)){  
        for(int i = 1; i <= n; i++)  
            scanf("%d",&a[i]);  
        ll ans = 0;  
        if(d1 == d2){  
            ll sum = 1;  
            for(int i = 2; i <= n; i++){  
                if(a[i] == a[i-1]+d1)  
                    sum++;  
                else{  
                    ans += (sum+1)*sum/2;  
                    sum = 1;  
                }  
            }  
            ans += (sum+1)*sum/2;  
        }  
        else{  
            l[0] = 0;r[n+1] = 0;  
            for(int  i = 1; i <= n; i++){  
                if(a[i] == a[i-1]+d1)  
                    l[i] = l[i-1]+1;  
                else  
                    l[i] = 1;  
            }  
            for(int i = n; i >= 1; i--){  
                if(a[i] == a[i+1]-d2)  
                    r[i] = r[i+1]+1;  
                else  
                    r[i] = 1;  
            }  
            for(int i = 1; i <= n; i++)  
                ans += (l[i]*r[i]);  
        }  
        printf("%lld\n",ans);  
    }  
    return 0;  
}


6.Persistent Link/cut Tree

7.Travelling Salesman Problem

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402

解题思路:/article/1958531.html

AC代码:

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 105;
int s

;

int main(){
    int n,m,sum,x,y;
    while(~scanf("%d%d",&n,&m)){
        sum = 0;x = 1;y = 2;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
            {
                scanf("%d",&s[i][j]);
                sum += s[i][j];
                if(((i+j)&1) && s[x][y]>s[i][j])
                    x = i,y = j;
            }
        if(n&1 || m&1)
        {
            printf("%d\n",sum);
            if(n&1)
            {
                for(int i = 1; i <= n; i++)
                {
                    for(int j = 1; j < m; j++)
                        if(i&1)
                            printf("R");
                        else
                            printf("L");
                    if(i < n)
                        printf("D");
                    else
                        printf("\n");
                }
            }
            else
            {
                for(int i = 1; i <= m; i++)
                {
                    for(int j = 1; j < n; j++)
                        if(i&1)
                            printf("D");
                        else
                            printf("U");
                    if(i<m)
                        printf("R");
                    else
                        printf("\n");
                }
            }
        }
        else
        {
            printf("%d\n",sum-s[x][y]);
            for(int i = 1; i <= n; i+=2)
            {
                if(x==i || x==i+1)
                {
                    for(int j = 1; j < y; j++)
                    {
                        if(j&1)
                            printf("D");
                        else
                            printf("U");
                        printf("R");
                    }
                    if(y < m)
                        printf("R");
                    for(int j = y+1; j <= m; j++)
                    {
                        if(j&1)
                            printf("U");
                        else
                            printf("D");
                        if(j < m)
                            printf("R");
                    }
                    if(i < n-1)
                        printf("D");
                }
                else if(x < i)
                {
                    for(int j = 1; j < m; j++)
                        printf("L");
                    printf("D");
                    for(int j = 1; j < m; j++)
                        printf("R");
                    if(i < n-1)
                        printf("D");
                }
                else
                {
                    for(int j = 1; j < m; j++)
                        printf("R");
                    printf("D");
                    for(int j = 1; j < m; j++)
                        printf("L");
                    printf("D");
                }
            }
            printf("\n");
        }
    }
    return 0;
}


8.Goldbach's Conjecture

9.Random Inversion Machine

10.Sometimes Naive

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: