20131006组队赛-Regionals 2010, Europe - Southeastern

来源:互联网 发布:全国中小学数据库 编辑:程序博客网 时间:2024/06/05 07:38

 

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-9double 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-9using 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 1050int 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-9using 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 1005int 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-9using 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));}