本文主要是介绍20131006组队赛-Regionals 2010, Europe - Southeastern,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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));
}
这篇关于20131006组队赛-Regionals 2010, Europe - Southeastern的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!