A题
比较 naive 的快读 + 指针题
首先对原数组做一个前缀和,然后我们枚举每一个左端点,而右端点是只能单调右移的,所以最终的复杂度是O()
#pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; const int MAXN = 2e7 + 50; long long sum[MAXN],k; int n; int R = 1,Ans = -1; struct ios { inline char read(){ static const int IN_LEN=1<<18|1; static char buf[IN_LEN],*s,*t; return (s==t)&&(t=(s=buf)+fread(buf,1,IN_LEN,stdin)),s==t?-1:*s++; } template <typename _Tp> inline ios & operator >> (_Tp&x){ static char c11,boo; for(c11=read(),boo=0;!isdigit(c11);c11=read()){ if(c11==-1)return *this; boo|=c11=='-'; } for(x=0;isdigit(c11);c11=read())x=x*10+(c11^'0'); boo&&(x=-x); return *this; } } io; int main() { io>>n>>k; long long T; for(int i = 1 ; i <= n ; i ++) { io>>T; sum[i] = sum[i - 1] + T; } for(int i = 1 ; i <= n ; i ++) { while(R < n && sum[R + 1] - sum[i - 1] <= k) R ++; if(sum[R] - sum[i - 1] == k) Ans = max(Ans,R - i + 1); } printf("%d",Ans); return 0; }
B题
DFS题,没什么好说的。
#include <bits/stdc++.h> using namespace std; #define int long long int n,k,total = 0; bool book[15]; void DFS(int x,int now) { for(int i = 0 ; i < n ; i ++) { if(book[i] == 0) { book[i] = 1; int Q = now; now = now * 10 + i; if(x == n) total+= ((now % k) == 0); else DFS(x + 1,now); now = Q; book[i] = 0; } } return ; } signed main() { cin >> n >> k; DFS(1,0); if(total) cout << total; else cout << -1; return 0; }
C题
一个 naive 的前缀和即可。
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 50; int n,m; long long sum[MAXN]; inline long long read() { long long x = 0; char ch = getchar(); for( ; ch > '9' || ch < '0' ; ch = getchar()); for( ; ch >= '0' && ch <= '9' ; ch = getchar()) x = (x << 3) + (x << 1) + (ch & 15); return x; } int main() { n = read() , m = read(); for(int i = 1 ; i <= n ; i ++) sum[i] = sum[i - 1] + read(); while(m --) { int l,r; l = read() , r = read(); printf("%lld\n",sum[r] - sum[l - 1]); } return 0; }
D题
二分答案即可,答案的初始值赋值为1e18
#include <bits/stdc++.h> using namespace std; #define int long long const int MAXN = 1e6 + 50; int n,m,sum[MAXN],A[MAXN]; inline long long read() { long long x = 0; char ch = getchar(); for( ; ch > '9' || ch < '0' ; ch = getchar()); for( ; ch >= '0' && ch <= '9' ; ch = getchar()) x = (x << 3) + (x << 1) + (ch & 15); return x; } bool check(int x) { if(x < 0) return 0; int ls = 0,now = 1,total = 0; for(int i = 1 ; i <= n ; i ++) { total += A[i]; if(total > x) total = A[i] , now ++; } if(now <= m) return 1; return 0; } signed main() { n = read() , m = read(); for(int i = 1 ; i <= n ; i ++) sum[i] = sum[i - 1] + (A[i] = read()); if(m == 1) {cout << sum[n] ; return 0;} int Ans = 1e18; for(int i = 62 ; i >= 0 ; i --) if(check(Ans - (1ll << i)) == 1) Ans -= (1ll << i); cout << Ans; return 0; }
E题
考察栈结构,没有什么好说的。
#pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; const int MAXN = 2e7 + 50; char s[MAXN]; int tack[MAXN]; int n,k; int main() { scanf("%s",&s); scanf("%d",&k); for(int t = 0 ; ; t ++) if(s[t] == '\0') {n = t ; break;} int C = k; int ls = -1,top = 0; for(int i = 0 ; i < n ; i ++) { while(top > 0 && s[tack[top]] > s[i] && C > 0)C -- , top --; tack[++top] = i; } int flag = 0; for(int i = 1 ; i <= top - C ; i ++) { if(s[tack[i]] != '0' || flag != 0) cout << s[tack[i]]; if(s[tack[i]] != '0') flag = 1; } if(!flag) cout << 0; return 0; }
F题
没有什么好说的,结论题。
#include <bits/stdc++.h> using namespace std; long long n,x = 1; int main() { cin >> n; while((x << 1) <= n) x <<= 1; cout << (x ^ (x - 1)); return 0; }
G题
naive 的字符串模拟题。
#include <bits/stdc++.h> using namespace std; char S[10005]; int Ans = 0; string a; void Get() { int tail = 0; getline(cin,a); int len = a.length(); for(int i = 0 ; i < len ; i ++) if(a[i] != ' ' && a[i] != '\n') tail ++ , S[tail] = a[i]; int cnt = 0,flag = 0; for(int i = 1 ; i <= tail ; i ++) { if(S[i] == '%') cnt ++; if(S[i] == 'A' && S[i + 1] == 'l' && S[i + 2] == 'a' && S[i + 3] == 'n') flag = 1; } Ans += cnt * flag; for(int i = 1 ; i <= tail ; i ++) S[i] = '\0'; return ; } int main() { int n; cin >> n; n ++; while(n --) Get(); cout << Ans; return 0; }
H 题
直接sort即可,可以重载运算符或者写cmp函数
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 50; struct Node { string Name,M,X,H; int len,id; } T[MAXN]; string A; bool cmp(Node A, Node B) { if(A.len != B.len) return A.len < B.len; if(A.Name != B.Name) return A.Name < B.Name; return A.id < B.id; } int main() { int n; cin >> n; for(int i = 1 ; i <= n ; i ++) { cin >> T[i].Name >> T[i].M >> T[i].X >> T[i].H; T[i].len = T[i].Name.length(); T[i].id = i; } sort(T + 1 , T + 1 + n , cmp); for(int i = 1 ; i <= n ; i ++) cout << T[i].Name << " " << T[i].M << " " << T[i].X << " " << T[i].H << endl; return 0; }
I 题
同上。
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 50; struct Node { string Name,M,X,H; int len,id; } T[MAXN]; string A; bool cmp(Node A, Node B) { if(A.len != B.len) return A.len < B.len; if(A.Name != B.Name) return A.Name < B.Name; return A.id < B.id; } int main() { int n; cin >> n; for(int i = 1 ; i <= n ; i ++) { cin >> T[i].Name >> T[i].M >> T[i].X >> T[i].H; T[i].len = T[i].Name.length(); T[i].id = i; } sort(T + 1 , T + 1 + n , cmp); for(int i = 1 ; i <= n ; i ++) cout << T[i].Name << " " << T[i].M << " " << T[i].X << " " << T[i].H << endl; return 0; }
J 题
直接找最小值即可。
#include <bits/stdc++.h> using namespace std; inline int read() { int x = 0; char ch = getchar(); for( ; ch > '9' || ch < '0' ; ch = getchar()); for( ; ch >= '0' && ch <= '9' ; ch = getchar()) x = (x << 3) + (x << 1) + (ch & 15); return x; } int main() { int M = 100000 , f = 0,n = read(),x; for(int i = 1 ; i <= n ; i ++) if((x = read()) < M) f = i , M = x; cout << f; return 0; }