CF1679A题解

题目:

传送门

思路:

首先排除 \(n\) 为奇数,的情况,由于车轮数都为偶数,所以若 \(n \bmod 2 = 1\),则输出 \(-1\)\(n<4\) 的情况也需输出 \(-1\),因为一辆车的最少轮子数为 \(4\),否则求出车辆数的最大值和最小值。

最小值:

由于 \(6 > 4\),所以六轮车越多,车的总数越少,若 \(n \bmod 6 = 0\),则车的总数为 \(n \div 6\)。否则分类讨论:若 \(n \bmod 6 = 2\),则可以把一辆六轮车和多出来的两个轮胎合并为两辆四轮车,则车辆数为 \(n \div 6 + 1\);若 \(n \bmod 6 = 4\),则可以再增加一辆四轮车,车辆总数也为 \(n \div 6 + 1\)。所以,若 \(n \bmod 6 = 0\),输出 \(n \div 6\),否则输出 \(n \div 6 +1\)

最大值:

由于 \(4 < 6\),所以四轮车越多,车的总数越多。还是分类讨论,若 \(n \bmod 4 = 0\),则车的总数为 \(n \div 4\);若 \(n \bmod 4 = 2\),则可以把一辆四轮车和多出来的两个轮胎合并为一辆六轮车,则车的总数仍为 \(n \div 4\)。所以不管 \(n \bmod 4\) 等于 \(0\) 还是 \(2\),都输出 \(n \div 4\)

代码:

#include <bits/stdc++.h>
  using namespace std;
long long m,n,x,y;//注意开 long long。
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>m;
	while (m--)
	{
		cin>>n;
		if (n&1 || n<4)//若 n 为奇数或 n<4。
		{
			cout<<-1<<endl;
			continue;
		}
		x=n/4;//最大值。
		if (n%6==0) y=n/6;//最小值。
		else y=n/6+1;
		cout<<y<<" "<<x<<endl;//注意先输出最小值再输出最大值。
	}
	return 0;
}


posted @ 2022-05-17 11:36  Jason142  阅读(16)  评论(0编辑  收藏  举报