题意:
有n名同学,每名同学对应都有m个成绩,如果一名同学的一科成绩是最高的,成为他是成功的,现在要求出所有成功的同学的数量。
思路:
先枚举每一列,求出每一列中的最大值,然后暴力枚举,如果枚举到的一名同学的这科成绩等于最大值,数量就加一,同时要用st数组判重,如果这个同学之前被选进答案了,以后就不算他了。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <queue> #include <vector> #include <map> #include <set> #define x first #define y second using namespace std; typedef long long LL; typedef pair<int, int>PII; const int N = 110; int n, m; char str[N][N]; int f[N]; int s[N][N]; bool st[N]; int main() { cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cin >> str[i][j], s[i][j] = str[i][j] - '0'; } for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) f[j] = max(f[j], s[i][j]); int cnt = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (s[i][j] >= f[j] && !st[i]) { cnt++; st[i] = true; } } } cout << cnt << endl; return 0; }
题意:
给你初始位于的坐标x0,y0,以及可以到达的最大x y值n和m,之后的k行,每行给出一个向量,现在要顺着向量方向移动,求不超过最大n m最多可以走多少步
思路:
正常模拟会TLE,正确思路是根据每个dx,dy的特点进行讨论,最大能走到步数应该是在dx或者dy方向上的最小值t,然后x的增量就是x+=t*dx,y+=t*dy。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <queue> #include <vector> #include <map> #include <set> #define x first #define y second using namespace std; typedef long long LL; typedef pair<int, int>PII; int main() { int n, m, k; cin >> n >> m; int x0, y0; cin >> x0 >> y0 >> k; LL step = 0; LL tx, ty, t; while (k--) { int dx, dy; cin >> dx >> dy; if (dx == 0) tx = 0x3f3f3f3f; else if (dx < 0) tx = (x0 - 1) / (-dx); else tx = (n - x0) / dx; if (dy == 0) ty = 0x3f3f3f3f; else if (dy < 0) ty = (y0 - 1) / (-dy); else ty = (m - y0) / dy; t = min(tx, ty); x0 += t * dx; y0 += t * dy; step += t; } cout << step << endl; return 0; }
C - Pocket Book
题意:
给你n个字符串,每个字符串的长度为m,k的范围是1到m,问如果每个字符串可以与其他字符串交换前缀的k个字母,求可以形成的不同字符串数量是多少
思路;
实际上就是求可以组合多少个不同的字符串。注意到其实每一列的各个字母都是可以互相调换的,其实就是统计每一列中的不同的字母数,a1,a2,...am。那么结果就是 a1*a2****am
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <queue> #include <vector> #include <map> #include <set> #define x first #define y second using namespace std; typedef long long LL; typedef pair<int, int>PII; const int N = 110; int n, m; char str[N][N]; int cnt[N][N]; int dif[N]; int main() { cin >> n >> m; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { cin >> str[i][j]; cnt[j][str[i][j]] ++; if(cnt[j][str[i][j]] == 1) dif[j] ++; } LL res = 1; for (int j = 0; j < m; j++) res = (res * dif[j]) % 1000000007; cout << res << endl; return 0; }