voidsolve() { int n, k; cin >> n >> k; int rx = n / k; int v[n][n]; int realm[rx][rx]; for(int i = 0 ; i < n ; i++){ for(int j = 0 ; j < n ;j++ ) { char c; cin >> c; v[i][j] = c - '0'; } } for(int i = 0 ; i < rx ; i++){ for(int j = 0 ; j < rx ;j++) { realm[i][j] = v[i*k][j*k]; cout << realm[i][j]; } cout << endl; } return; }
jiangly
jiangly写的更简单,用string读入每一行就行了。不用开二维。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
voidsolve() { int n, k; std::cin >> n >> k;
std::vector<std::string> s(n); for (int i = 0; i < n; i++) { std::cin >> s[i]; } for (int i = 0; i < n; i += k) { for (int j = 0; j < n; j += k) { std::cout << s[i][j]; } std::cout << "\n"; } }
C
题意
你得到两个字符串 a 和 b ,长度为 n 。然后,你(被迫违背你的意愿)回答 q 查询。 对于每一个查询,您都将得到一个由 l 和 r 限定的范围。在一个操作中,您可以选择整数 ii ( l≤i≤r )并设置 ai=x ,其中 x 是您想要的任何字符。输出必须执行的最小操作数,以使 sorted(a[l..r])=sorted(b[l..r]) 。对一个查询执行的操作不会影响其他查询。 对于任意字符串 c , sorted(c[l..r]) 表示由字符 cl,cl+1,…,cr。 c按字典顺序排序。
int ans = 0; for (int c = 0; c < 26; c++) { ans += std::max(0, pre[r][c] - pre[l][c]); } std::cout << ans << "\n"; } }
问题
c题TLE好多次。很奇怪。不过TLE答案确实比较繁琐。
D
题意
给定两个整数 n 和 x ,求正整数的三元组( a,b,ca,b,c )的个数,使得 ab+ac+bc≤n和 a+b+c≤x 。a,b,c严格大于0;
思路
遍历a来限制b,遍历范围中的b限制c。这样全都能遍历完。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
voidsolve() { int n, x; cin >> n; cin >> x; int count = 0; for (int a = 1; a <= x; a++) { int bmax = min(x - a, n / a); for (int b = 1; b <= bmax; b++) { int cmax = min(x - a - b, (n - a * b) / (a + b)); if(cmax > 0) count += cmax; } } cout << count << '\n'; }