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)); }