《看了受制了》第三十五天,6道题,合计193道题

发布时间 2023-10-07 10:23:48作者: wxzcch

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;
}