2023年10月6日
可惜,没时间下午要兼职,开始的也晚了哎。不然5道肯定不成问题
武汉大学2023新生E 不是n
皇后问题
题目理解
这个读懂题后,发现只需要输出1 ~ n^2
即可。因为只要符合条件的放法,必然sum
相同
代码实现
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
for(int j = 1; j <= n; j++)
cout << i * n + j << " ";
cout << endl;
}
return 0;
}
武汉大学2023新生A 教科书般的亵渎
题目理解
排个序,如果发现有差值大于1
那就肯定无法实现。
代码实现
void solve()
{
ll n;
cin >> n;
vector<ll> vec;
vec.push_back(0);
for(int i = 1; i <= n; i++)
{
int b;
cin >> b;
vec.push_back(b);
}
sort(vec.begin(), vec.end());
bool flag = true;
for(int i = 1; i < (int)vec.size(); i++)
if(vec[i] - vec[i - 1] > 1)
{
flag = false;
break;
}
if(flag) cout << "YES";
else cout << "NO";
return;
}
武汉大学2023新生赛 L 小镜的数学题
题目理解
只要让原数二进制的每一位1
与上0即可。再把这个数求出来
代码实现
void solve()
{
ll x;
cin >> x;
vector<int> v;
while(x)
{
v.push_back(x % 2);
x >>= 1;
}
reverse(v.begin(), v.end());
ll res = 0;
ll q = 1;
for(int i = (int)v.size() - 1; i >= 0; i--)
{
if(!v[i]) res += q;
q *= 2;
}
cout << q;
return;
}
武汉大学2023新生赛 K 矩形分割
题目理解
Acwing
周赛原题,直接每次最优方式,就是按照短的边去分割即可。每次分割的时候进行加和边长即可。
代码实现
void solve()
{
ll n, m;
cin >> n >> m;
if(n < m) swap(n, m);
ll res = 0;
while(m)
{
res += m * (n / m);
n = n - m * (n / m);
ll t = n;
n = m;
m = t;
}
cout << res;
return;
}
Div.2 Round901 Jellyfish and Undertale
题目大意
有一个炸弹最可设置为a
秒炸,一开始它还剩b
秒,你有n
个扳手,每个扳手可以给炸弹设置为\(min(a, c + k_i)\),问炸弹最多坚持多久?
我们可以发现。扳手如果\(k_i ≥ a\),那就会加a - 1
秒,不然就是\(k_i\),最后再加上b
即可。
代码实现
void solve()
{
ll a, b, n;
cin >> a >> b >> n;
ll res = 0;
res += b;
for(int i = 1; i <= n; i++)
{
ll k;
cin >> k;
res += min(k, a - 1);
}
cout << res << endl;
return;
}
Div.2 Round901 B Jellyfish and Game
题目大意
有俩海鲜,来回换数字,换k
次,每次都是最优决策,问最后最大的和是多少?
题目理解
我们不难发现有如下规律:
- 当且仅当
min(a) < max(b)
,第一个海鲜会交换 - 当且仅当
min(b) > max(a)
, 第二个海鲜会交换 - 所以我们只需要考虑,
k
是奇数还是偶数即可。奇数,符合条件就换,偶数符合条件就换回来。
代码实现
void solve()
{
ll n, m , k;
cin >> n >> m >> k;
vector<ll> a(n), b(m);
for(int i = 0 ; i < n; i++) cin >> a[i];
for(int i = 0 ; i < m; i++) cin >> b[i];
sort(a.begin(), a.end());
sort(b.begin(), b.end());
if(a[0] < b[b.size() - 1]) swap(a[0], b[b.size() - 1]);
if(k % 2 == 0)
{
sort(a.begin(), a.end());
sort(b.begin(), b.end());
if(b[0] < a[a.size() - 1]) swap(b[0], a[a.size() - 1]);
}
ll res = 0;
for(int i = 0 ; i < n ; i++) res += a[i];
cout << res << endl;
return;
}