A 清楚姐姐学信息论
大概意思就是问a的b次和b的a次谁大,所以只需要一些数学运算即可分类讨论出结果
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
void solve()
{
int a, b;
cin >> a >> b;
if (a > b) swap(a, b);
if (a == b)
{
cout << a << endl;
return;
}
if (a > b && b >= 3)
{
cout << b << endl;
}
else if (b > a && a >= 3)
{
cout << a << endl;
}
else
{
if (a == 2)
{
if (b == 3) puts("3");
else if (b == 4) puts("2");
else puts("2");
}
}
}
signed main()
{
solve();
}
B清楚姐姐学构造
用题给三个式子互相推一推,已知C所以可以先得到A再通过得到的A推出B,最后从前往后遍历一遍判断三个式子互相满不满足,不满足输出NO
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], c[N];
int qmi(int a, int b, int p)
{
int res = 1 % p;
while (b)
{
if (b & 1) res = res * a % p;
b >>= 1;
a = a * a % p;
}
return res;
}
void solve()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> c[i];
for (int i = 1; i <= (n + 1) / 2; i++)
{
a[i] = (c[i] + c[n - i + 1]) * qmi(2, m - 2, m) % m;
a[n - i + 1] = a[i];
b[i]=(c[i]-a[i]+m)%m;
b[n-i+1]=(c[n-i+1]-a[i]+m)%m;
}
for (int i = 1; i <= (n + 1) / 2; i++)
{
if (((b[i] + b[n - i + 1]) % m) != 0)
{
puts("no");
return;
}
if (a[i] != a[n - i + 1])
{
puts("no");
return;
}
if ((a[i] + b[i]) % m != c[i] % m)
{
puts("No");
return;
}
}
puts("yes");
for (int i = 1; i <= n; i++) cout << a[i] << " ";
puts("");
for (int i = 1; i <= n; i++) cout << b[i] << " ";
puts("");
}
signed main()
{
solve();
}
C清楚姐姐学01 背包(easy)
三层循环
第一层遍历取走的点,后两层遍历01背包,最后跑完01背包后判断一下不取这个点和取这个点的差值,满足条件输出0不然输出差值+1。
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 110;
int dp[N];
int v[N], w[N];
void solve()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> w[i] >> v[i];
for (int k = 1; k <= n; k++)
{
memset(dp,0,sizeof dp);
for (int i = 1; i <= n; i++)
{
if (i == k) continue;
for (int j = m; j>=w[i]; j--)
{
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
}
}
if (dp[m - w[k]] + v[k] > dp[m]) puts("0");
else
{
cout << dp[m] - dp[m - w[k]] - v[k] + 1 << endl;
}
}
}
signed main()
{
solve();
}
E清楚姐姐打怪升级
讨论攻击次数,最后一起算时间。
把hp分成两部分,直接伤害和真实伤害,直接伤害就是打一下打出的伤害
真实伤害就是算上回复后的伤害即(直接伤害减去回复量)
照着这个思路去模拟,如果直接伤害可以直接打死,算攻击一次,不能去算真实伤害,如果真实伤害为负就是打不死。
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int hp[N], hui[N];
void solve()
{
int n, t, attack;
int ans = 0;
cin >> n >> t >> attack;
for (int i = 1; i <= n; i++)
{
cin >> hp[i] >> hui[i];
}
for (int i = 1; i <= n; i++)
{
hui[i] *= t;
if (hp[i] - attack <= 0)
{
ans++;
continue;
}
else
{
ans++;
hp[i] -= attack;
int realattack = attack - hui[i];
if (realattack <= 0)
{
puts("-1");
return;
}
else
{
ans += hp[i] / realattack;
if (hp[i] % realattack) ans++;
}
}
}
ans--;
ans = ans * t + 1;
cout << ans << endl;
return;
}
signed main()
{
solve();
}
L清楚姐姐的三角形一
数学题
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
void solve()
{
int a, b, c;
cin >> a >> b >> c;
int sum = a + b + c;
if (sum % 2)
{
puts("No");
return;
}
else
{
sum /= 2;
a = sum - a;
b = sum - b;
c = sum - c;
if (a + b > c && a + c > b && b + c > a)
{
puts("Yes");
cout << a << " " << b << ' ' << c << endl;
}
else puts("No");
}
}
signed main()
{
int t;
cin >> t;
while (t--) solve();
}
M清楚姐姐的三角形二
三个数周期性构造即可
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int arr[N];
void solve()
{
arr[1] = 1;
arr[2] = 2;
arr[3] = 1;
for (int i = 4; i <= N; i++)
{
arr[i] = arr[i - 3];
}
int n;
cin >> n;
for (int i =1; i <= n; i++) cout << arr[i] << " ";
puts("");
}
signed main()
{
solve();
}