现在的位置: 首页 > 综合 > 正文

20131006组队赛-Regionals 2010, Europe – Southeastern

2013年04月30日 ⁄ 综合 ⁄ 共 5114字 ⁄ 字号 评论关闭

 

A. The Table

 

java题目,就是求每一列的数字的乘积,求最大的乘积的那一个列号:

 

代码:

import java.io.*;
import java.math.*;
import java.util.*;
import java.text.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin = new Scanner (new BufferedInputStream(System.in));
        int a,b;
        BigInteger n;
        BigInteger array[]= new BigInteger[28];
        while(cin.hasNext())
        {
        	for(int i=0;i<=25;i++)
        		array[i]=BigInteger.valueOf(1);
            a=cin.nextInt();
            b=cin.nextInt();
            for(int j = 0; j < b; ++j)
            {
                for(int i = 0; i < a; ++i)
                {
                	n = cin.nextBigInteger();
                    array[i] = array[i].multiply(n);
                }
            }
            BigInteger tt;
            tt = BigInteger.valueOf(1);
            tt = tt.multiply(array[0]);
            int tp = 1;
            for(int i = 1; i < a; ++i)
            {
                if(array[i].compareTo(tt)>=0)
                {
                    tt = array[i];
                    tp = i+1;
                }
            }
            System.out.println(tp);
        }
    }
}


E. Control Points

  e题刚开始大家都在交,可是就是WA,后来说是精度的问题,神奇....

 

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
#define maxn 100005
#define eps 1e-9
double num[maxn];
using namespace std;

int QuickMod(int  a,int b,int n)
{
    int r = 1;
    while(b)
    {
        if(b&1)
            r = (r*a)%n;
        a = (a*a)%n;
        b >>= 1;
    }
    return r;
}

int n;
int main()
{
    while(scanf("%d",&n) == 1)
    {
        for(int i = 0; i < n; ++i)
            scanf("%lf",&num[i]);
        int ans = 1;
        double tp = num[0];
        for(int i = 1; i < n; ++i)
        {
            if(num[i] - tp + eps >= 1.0)
            {
                tp = num[i];
                ans++;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

G. Cosmic Station

 

 这是我们最后A的题,就是说给你一个图的描述。然后对于叶子节点,给出它到后面剩余节点的中间经过的路径数。

问你这幅图里面有多少的内部节点。

 我们开始一直在找规律,然后就一直不知道咋搞。其实我们可以这样想:对于给出的数字,我们可以一步一步的构

建出这个图。我们开始存在1到2的图,比如来第三个叶子节点的时候,那么我们就可以计算出1到3的距离和2到3的距

离,那么我们有(1->3)+(2->3)路径长度,然后我们剪掉1-2的路径,那么我们就会得到新添的3的对应的新增的路径

数的二倍。然后我们就可以得到对应的增加的内部节点的数目。然后对于每一个点都会有一个从1-此点和从某个已经

存在的点到此点的对应的增加的点数,这样一直求最小,就可以求出新增的点对应的增加的内部节点的数目。全部累

加起来就可以了:

 

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-9
using namespace std;

int QuickMod(int  a,int b,int n)
{
    int r = 1;
    while(b)
    {
        if(b&1)
            r = (r*a)%n;
        a = (a*a)%n;
        b >>= 1;
    }
    return r;
}
#define maxn 1050
int num[maxn][maxn];
int main()
{
    int n;
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        for(int i = 1; i < n; ++i)
        {
            for(int j = i+1; j <= n; ++j)
            {
                scanf("%d", &num[i][j]);
                num[j][i] = num[i][j];
            }
        }
        int ans = 0;
        ans = num[1][2] - 1;
        for(int i = 3; i <= n; ++i)
        {
            int L = INF;
            for(int j = 2; j < i; ++j)
            {
                L = min(L,  num[i][j] + num[1][i] - num[1][j]);
            }
            ans += (L/2-1);
        }
        cout << ans << endl;
    }
    return 0;
}

 

H. Game

 

这是一道博弈的题目,先一直在搞A的JAVA,没有搞,结果大家都过了,就赶紧过来弄。刚开始就简单考虑了一下拿

走的情况WA了。其实就是在判断后面的点的胜负状态的时候需要用到前面的结果。记忆化搜索,对于每一个点,他都

有每行和每列的情况,当我们面对一个点的时候,我们需要用前面的点来决断当前的点的胜负状态。如果前面的点是

必败态,那么我们这一点就是必胜态。对于行和列我们都会影响到当前点的状态。只要有一种情况使得当前点必胜,

那么此点的状态就是必胜态。

 

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-9
using namespace std;

int QuickMod(int  a,int b,int n)
{
    int r = 1;
    while(b)
    {
        if(b&1)
            r = (r*a)%n;
        a = (a*a)%n;
        b >>= 1;
    }
    return r;
}

#define maxn 1005
int num[maxn][maxn];
int NUM[maxn][maxn];
int ans[maxn][maxn];
int n;
void init()
{
    memset(num, 0, sizeof(num));
    memset(NUM, 0, sizeof(NUM));
    memset(ans, 0, sizeof(ans));
}
int solve()
{
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
        {
            NUM[i][j] = NUM[i][j-1]^num[i][j];
        }
    }
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
            num[i][j] ^= num[i-1][j];
    }
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
        {
            ans[i][j] = 0;
            if(!num[i][j] && !ans[i][j-1])
                ans[i][j] = 1;
            if(!NUM[i][j] && !ans[i-1][j])
                ans[i][j] = 1;
        }
    }
    if(ans[n][n])return 1;
    else return 0;
}
int main()
{

    while(scanf("%d", &n) == 1)
    {
        int tt;
        init();
        for(int i = 1; i <= n; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                scanf("%d", &tt);
                num[i][j] = (tt&1);
            }
        }
        int ans = solve();
        if(ans)printf("W\n");
        else printf("L\n");
    }
    return 0;
}

J. Shares

 

  这是签到题中的签到题,直接求输入的两个数字a,b->b/(a+1):

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-9
using namespace std;

int QuickMod(int  a,int b,int n)
{
    int r = 1;
    while(b)
    {
        if(b&1)
            r = (r*a)%n;
        a = (a*a)%n;
        b >>= 1;
    }
    return r;
}
int main()
{
    int A, B;
    while(scanf("%d%d", &A, &B) == 2)
        printf("%d\n", B/(A+1));
}

 

 

抱歉!评论已关闭.