1 找最大值 1 2 3 4 5 6 7 8 9 10 11 #include <stdio.h> int main () { int mx = 0 ; for (int i = 0 ; i < 4 ; i++) { int x; scanf ("%d" , &x); mx = mx > x ? mx : x; } printf ("%d\n" , mx); }
2 二三得六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <stdio.h> int main () { int n, m; scanf ("%d %d" , &n, &m); int d = m / n; if (m % n != 0 ) { printf ("-1\n" ); return 0 ; } int x = 0 ; int y = 0 ; while (d % 2 == 0 ) { x++; d /= 2 ; } while (d % 3 == 0 ) { y++; d /= 3 ; } if (d != 1 ) printf ("-1\n" ); else printf ("%d" , x + y); return 0 ; }
3 奕悟
首先判断开始和结束坐标是否重合,重合则为0。
其次判断是否为同一条直线上,若在同一条直线上答案为1。
如果起点和终点的颜色不同,则不能通过指定方式到达。
其他情况只需要两步就可以到达。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> int main () { int x1, y1, x2, y2; scanf ("%d %d %d %d" , &x1, &y1, &x2, &y2); if (x1 == x2 && y1 == y2) { printf ("0\n" ); } else if (abs (x1 - x2) == abs (y1 - y2)) { printf ("1\n" ); } else { if ((x1 + y1) % 2 == (x2 + y2) % 2 ) { printf ("2\n" ); } else { printf ("-1\n" ); } } return 0 ; }
4 弈研顶针 考虑先斜着达到终点的同行或同列的位置,再到终点。
我们发现最短路径的步数为起点到终点 的横坐标差 和纵坐标差 的较大值。
1 2 3 4 5 6 7 8 9 10 11 #include <stdio.h> int main () { int x1, y1, x2, y2; scanf ("%d %d %d %d" , &x1, &y1, &x2, &y2); int ans = abs (x1 - x2) > abs (y1 - y2) ? abs (x1 - x2) : abs (y1 - y2); printf ("%d\n" , ans); return 0 ; }
5 是奇数吗? 考虑使用前缀和计算区间的和。
修改区间 $[l,r]$ 的值为 $k$ , 修改后的值为
$\sum_{i=1}^{n}a_i-\sum_{i=l}^{r}a_i+(r-l+1)k=pre[n]-(pre[r]-pre[l-1])+(r-l+1)k$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <stdio.h> long long a[100010 ], b[100010 ];int main () { int n, q; scanf ("%d %d" , &n, &q); for (int i = 1 ; i <= n; i++) { scanf ("%lld" , &a[i]); b[i] = b[i - 1 ] + a[i]; } while (q--) { int l, r, k; scanf ("%d %d %d" , &l, &r, &k); long long x = b[n] + (r - l + 1 ) * k - (b[r] - b[l - 1 ]); if (x % 2 ) printf ("YES\n" ); else printf ("NO\n" ); } return 0 ; }
6 它是它的子串吗? 首先较短的串为子串 substr。
讲较长的串复制一遍拼接在其后面,在其中查找是否存在字串 substr。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <bits/stdc++.h> using namespace std;int main () { string str, substr; cin >> str >> substr; if (substr.size () > str.size ()) swap (str, substr); str += str; if (str.find (substr) != -1 ) cout << "YES" << endl; else cout << "NO" << endl; return 0 ; }
7 死亡顺序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <bits/stdc++.h> using namespace std;int main () { int n, k; cin >> n >> k; pair<int , int > p[n + 1 ]; int b[n + 1 ]; for (int i = 1 ; i <= n; i++) { cin >> b[i]; b[i] %= k; if (b[i] == 0 ) b[i] = k; p[i].first = b[i]; p[i].second = n - i + 1 ; } sort (p + 1 , p + n + 1 ); for (int i = n; i >= 1 ; i--) cout << n - p[i].second + 1 << " " ; cout << '\n' ; return 0 ; }