省赛排位赛2:
思路:
设两个方程直接解出来就行
代码:
#include<bits/stdc++.h>
using namespace std;
int n, m;
int main()
{
int n, m;
int ans1, ans2;
cin >> n >> m;
ans1 = n - (-3 + sqrt(3 * 3 + 4 * 2 * (n + m))) / 2;
ans2 = n - (-3 - sqrt(3 * 3 + 4 * 2 * (n + m))) / 2;
if (ans1 <= n && ans2 >= 0) cout << ans1;
else cout << ans2;
}
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n;
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> n;
ll ans = 0;
ll nn = n;
ll i = 1;
while (nn)
{
ans += n / i;
i <<= 1ll;
nn >>= 1ll;
}
cout << ans << endl;
}
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
int a[10000005];
int main()
{
int n, p;
cin >> n >> p;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
a[i] += a[i - 1];
}
int ans = 0;
for (int i = 1; i < n; i++)
{
ans = max(ans, (a[i] % p + (a[n] - a[i]) % p));
}
cout << ans << endl;
return 0;
}
思路:
需要得到每个(x,y)下的最大公约数,再找出一定的规律
代码:
#include<bits/stdc++.h>
using namespace std;
long long t, a, b, c, n, ca, cb, cc;
int gcd(int x, int y)
{
if (x < y)swap(x, y);
if (x % y)return gcd(y, x % y);
return y;
}
int main()
{
cin >> t;
while (t--)
{
cin >> n >> a >> b;
c = a * b / gcd(a, b);
ca = n / a, cb = n / b, cc = n / c;
ca -= cc, cb -= cc;
cout << (n + n - ca + 1) * ca / 2 - (1 + cb) * cb / 2 << endl;
}
return 0;
}
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1000010], n;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin>>a[i], a[i] ^= a[i - 1];
ll ans = 0;
for (int i = 0, x = (1 << i); i < 32; i++, x <<= 1)
{
int cnt = 0;
for (int j = 1; j <= n; j++)
if ((a[j] >> i) & 1) cnt++;
ans += 1LL * cnt * (n + 1 - cnt) * x;
}
cout << ans << endl;
return 0;
}
思路:
给定一个能达到数据范围的斐波拉契数组,包含所有数据范围内的斐波拉契数,再进行几个特判
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[100];
string check(ll n, ll x, ll y)
{
if (x == 1 && y == 1)
{
return "YES";
}
if (y <= f[n] && y > f[n - 1])
{
return "NO";
}
if (y > f[n])
{
y = y - f[n];
}
return check(n - 1, y, x);
}
int main()
{
ll t, n, x, y;
f[0] = 1;
f[1] = 1;
for (int i = 2; i <= 45; i++)
f[i] = f[i - 1] + f[i - 2];
cin >> t;
while (t--)
{
cin >> n >> x >> y;
cout << check(n, x, y) << endl;;
}
return 0;
}
思路:
01背包问题,就题目改了一下,直接用模板就行
代码:
#include<bits/stdc++.h>
using namespace std;
int h, t, n, a[401], z[401], l[501], dp[401][401];
int main() {
cin >> h >> t >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i] >> z[i] >> l[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = h; j >= a[i]; j--)
{
for (int k = t; k >= z[i]; k--)
{
dp[j][k] = max(dp[j][k], dp[j - a[i]][k - z[i]] + l[i]);
}
}
}
cout << dp[h][t];
return 0;
}