T1.最小贪吃量\rm{T1}.最小贪吃量

思路:思路:

这其实就是一个贪心问题。先这其实就是一个贪心问题。先sort从大到小排序AB,再从大到小排序A与B,再for$循环遍历A与B求出A与B能吃的数量cnt_a与cnt_b,ans就=min(cnt_a,cnt_b)。$

注意!XY要开long long!!!\color{red}注意!X和Y要开\sf{long ~long}!!!

代码:代码:

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int N = 2e5 + 5;
ll a[N], b[N], n, x, y;// 定义A、B、N、X、Y,大写用着不方便,我用的是小写

bool cmp (int o, int p)
{
	return o > p;
}

int main ()
{
	freopen("eat.in", "r", stdin);
	freopen("eat.out", "w", stdout);
	cin >> n >> x >> y;
	for (int i = 0; i < n; i++) cin >> a[i];
	for (int i = 0; i < n; i++) cin >> b[i];
  // 排序
	sort(a + 0, a + n, cmp);
	sort(b + 0, b + n, cmp);
  // 定义变量cnta、cntb、resa、resb
	ll cnta = 0, cntb = 0, resa = 0, resb = 0;
  // 循环遍历
	for (int i = 0; resa <= x && i < n; i++) resa += a[i], cnta++;
	for (int i = 0; resb <= y && i < n; i++) resb += b[i], cntb++;
  // 取最小值
	ll ans = min(cnta, cntb);
  // 输出
	cout << ans;
	return 0;
}

T2.三连纯一数\rm{T2}.三连纯一数

思路:思路:

由样例3得知输出数最大为1013(112222222233),那咱就使用三层由样例3得知输出数最大为10^{13}(即112222222233),那咱就使用三层for循环枚举遍历出数组ans,最后循环枚举遍历出数组ans,最后cout<<ans[n]

代码:代码:

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
ll n, a[13] = {0, 1, 11, 111, 1111, 11111, 111111, 1111111, 11111111, 111111111, 1111111111, 11111111111, 111111111111};

int main ()
{
 	freopen("three.in", "r", stdin);
 	freopen("three.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= 13; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			for (int k = 1; k <= j; k++)
			{
				n--;
				if (n == 0) cout << a[i] + a[j] + a[k];
			}
		}
	}
	return 0;
}

T3.倒立数对\rm{T3.倒立数对}

思路:思路:

根据数学公式我们可算出cntij×cntji=这个区间的数。再两层根据数学公式我们可算出cnt_{ij}\times cnt_{ji}=这个区间的数。再两层for$循环遍历cnt_{ij}\times cnt_{ji};将遍历结果加入一个答案变量中。最后输出答案变量ans。$

代码:代码:

#include <bits/stdc++.h>
using namespace std;

long long ans = 0, n, cnt[10][10];

int main ()
{
	freopen("number.in", "r", stdin);
	freopen("number.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int l, r = i % 10, k = i;
		while (k > 0)
		{
			l = k % 10;
			k /= 10;
		}
		cnt[l][r]++;
	}	
	for (int i = 1; i <= 9; i++)
	{
		for (int j = 1; j <= 9; j++) ans += cnt[i][j] * cnt[j][i];
	}
	cout << ans;
	return 0;
}

$$\green{\rm{8472690697868}}$$

$$\green{\rm{THE~~END}}$$