(这次写的细一些)

A.最小贪吃量

题意:任意排序后,若前面的甜度大于X,或者前面的咸度大于Y就停止,求前面最少有多少盘。 思路:运用sort函数排序,由于排序后是由小到大,所以需要从后到前循环,并判断甜咸度,同时统计数量。 错因:忘记给过程中检验的代码加注释。 代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	freopen("eat.in","r",stdin);
	freopen("eat.out","w",stdout);
	long long n,x,y,c=0,s=0,m=0;
	bool l=0;
	cin>>n>>x>>y;
	long long a[n],b[n];
	for(long long i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(long long i=0;i<n;i++)
	{
		cin>>b[i]; 
	}
	sort(a,a+n);
	sort(b,b+n);
	for(int i=n-1;i>=0;i--)
	{
		if(l==0)
		{
			c+=a[i];
			s+=b[i];
			//cout<<a[i]<<" "<<b[i]<<endl;
			if(c>x||s>y)
			{
				m=n-i;
				l=1;
			}
		} 
	}
	if(m==0)
	{
		cout<<n;
		return 0;
	}
	cout<<m;
	return 0;
}

B.三连纯一数

题意:找出第N小的三个由1组成的数的和。 思路:用枚举法,由于N<333所以这个数小于112222222233,所以可以用三层循环,分别找出三个数。 错因:不会,骗了几分。 代码:

#include<bits/stdc++.h>
using namespace std;
long long a[]={0,1,11,111,1111,11111,111111,1111111,11111111,111111111,1111111111,11111111111,111111111111,1111111111111};
int main()
{
	freopen("three.in","r",stdin);
	freopen("three.out","w",stdout);
	long long n,m=0;
	cin>>n;
	for(long long i=1;i<=13;i++)
	{
		for(long long j=1;j<=i;j++)
		{
			for(long long l=1;l<=j;l++)
			{
				m++;
				if(m==n)
				{
					cout<<a[i]+a[j]+a[l];
					return 0;
				}
			}
		}
	}
	return 0;
}

C.倒立数对

题意:找到N以内的两个数AB,A的最后一位数字等于B的第一位数字,且A的第一位数字等于B的最后一位数字。 思路:先统计N以内每种第一位数字和最后一位数字,再用sum统计有多少组AB(sum=sum+cnt[i][j]*cnt[j][i])。 错因:代码超时了。 代码:

#include <bits/stdc++.h>
using namespace std;
long long cnt[10][10];
int main()
{
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);
	int n,sum=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x=i;
		while(x>=10)
		{
			x=x/10;
		}
		cnt[x][i%10]++;
	}
	for(int i=1;i<10;i++)
	{
		for(int j=1;j<10;j++)
		{
			sum=sum+cnt[i][j]*cnt[j][i];
		}
	}
	cout<<sum;
	return 0;
}

总结: 还是没好好思考,没认真写。