B、减成一
简单dp,差分处理,你会发现如果一个数比前一个数小,那么这个数可以在处理前面数的时候处理完毕。
一个数比前面数大,那么多花的步骤就是和前面一个数的差值。左边取在这个点,右边可以随便控制。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 1e5 + 7;
int info[MAX], dp[MAX];
int main() {
int T; cin >> T;
while (T--) {
int n; cin >> n;
for (int i = 1; i <= n; i++)
cin >> info[i];
dp[0] = 0; info[0] = 1;
for (int i = 1; i <= n; i++) {
if (info[i] > info[i - 1])
dp[i] = dp[i - 1] + info[i] - info[i - 1];
else
dp[i] = dp[i - 1];
}
cout << dp[n] << endl;
}
return 0;
} C、面积
签到题,不会吧不会吧签到题还有人WA?
#include<bits/stdc++.h>
using namespace std;
int main() {
double t, x, sum;
cin >> t;
while (t--) {
cin >> x;
sum = x * x + 2 * 3.14 * (x / 2) * (x / 2);
printf("%.2f\n", sum);
}
}
E、赛马
第一眼以为是贪心,打算对2个人都排序然后用游标计数……再仔细看个题,发现B数组不能动。
那就更简单了,直接把A数组排个序,再去二分找顺序输入的B元素第一个大于的值。以为你留着赢下一把也是+1,还不如现在就比了。
所以直接STL找上界即可。
#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#pragma GCC optimize("O2,O3,Ofast,inline,unroll-all-loops,-ffast-math")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
const int mod = 1e9+7;
const int maxn = 10005;
#define stop system("pause")
inline ll read(){
ll s = 0, w = 1; char ch = getchar();
while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
multiset<int> q;
int main(){
int T = read();
while(T--){
q.clear();
int n = read();
for(int i = 0 ; i < n ;++i){
int tmp = read();
q.insert(tmp);
}
int ans = 0;
for(int i = 0 ; i < n ;++i){
int tmp = read();
auto it = upper_bound(q.begin(),q.end(),tmp);
if(it != q.end()){
++ans;
q.erase(it);
}
}
cout<<ans<<endl;
}
} F、三角形
很容易发现按斐波那契数列分隔即可最多。那么问题就变成了,最多可以分成几个斐波那契前n项和。题目居然没出ull……ll的输入居然A了。。搞得我用了个__int128。怕加法溢出,最后会发现只要100多一点点就可以超过ull的范围了。
#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#pragma GCC optimize("O2,O3,Ofast,inline,unroll-all-loops,-ffast-math")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
const int mod = 1e9 + 7;
const int maxn = 100005;
inline ull read() {
ull s = 0, w = 1; char ch = getchar();
while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
__int128 fib[10005] = { 0,1,1 };
int main() {
for (int i = 3; i < 1005; ++i) fib[i] = fib[i - 1] + fib[i - 2];
// for(int i = 3 ; i < 1005 ; ++i) cout<<fib[i]<<endl;
int t = read();
while (t--) {
ull a = read();
if (a < 3) {
cout << a << endl; continue;
}
ll ans;
for (int i = 3; i < 1005; ++i) {
if (fib[i] - 1 > a) {
ans = i - 3;
break;
}
}
cout << ans << endl;
}
return 0;
} H、直线
一看就是大数,要么套要么你就打大数的板子……建议学下py
t=int(input())
while t>0:
n=int(input())
print((n*(n-1)//2))
t-=1
J、最大值
KMP的模板题,只要你能发现待匹配串是除开第一个字符后面的串,去匹配的是输入字符串s。
j在的位置就是长度。
#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#pragma GCC optimize("O2,O3,Ofast,inline,unroll-all-loops,-ffast-math")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; typedef unsigned long long ull;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
const int maxn = 100005;
inline ll read() {
ll s = 0, w = 1; char ch = getchar();
while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * w;
}
int cnt = 0, ans = 0;
int Next[maxn];
void getnext(char b[]) {
int i, j, len = strlen(b);
Next[0] = -1;
for (i = 0, j = -1; i < len;)
if (j == -1 || b[i] == b[j]) {
++i; ++j;
if (b[i] != b[j]) Next[i] = j;
else Next[i] = Next[j];
}
else j = Next[j];
}
void kmp(char a[], char b[]) {
int i, j, n, len;
getnext(b); n = strlen(a); len = strlen(b);
// cout<<" n len "<<n<<" "<<len<<endl;
for (i = j = 0; i < n && j < len;) {
if (j == -1 || a[i] == b[j]) {
i++, j++;
// cout<<"ahdioh "<<a[i] << " dasi "<<b[j]<<endl;
}
else j = Next[j], cnt = 0; ans = max(j, ans);
}
}
char a[maxn], b[maxn];
int main() {
js;
int n;
cin >> n;
while (n--) {
ans = 0;
cin >> b;
strcpy(a, b + 1);
kmp(a, b);
cout << ans << endl;
}
return 0;
} 
京公网安备 11010502036488号