A. 最小贪吃量

题意:

输入N,X,Y。并输入甜度与咸度数组求最终吃下的最少可能菜数。

思路:

[1]sort从大到小排序A与B。 [2]for循环遍历A与B求出A与B能吃的数量cnt1与cnt2。 [3]ans=min(cnt1,cnt2).

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,x,y;
long long a[200005],b[200005];
int cmp(int x,int y){
	return x>y;
}
int main(){
	freopen("eat.in","r",stdin);
	freopen("eat.out","w",stdout);
	cin>>n>>x>>y;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}	
	sort(a+1,a+n+1,cmp);//sort排序
	sort(b+1,b+n+1,cmp);
	long long cnt1=0,cnt2=0;
	long long xx=0,yy=0;
	for(int i=1;i<=n;i++){//循环遍历
		if(xx<=x){
			xx+=a[i];
			cnt1++;
		}
	}
	for(int i=1;i<=n;i++){
		if(yy<=y){
			yy+=b[i];
			cnt2++;
		}
	}
	long long g=min(cnt1,cnt2);
	cout<<g;
	return 0;
  }
}

B. 三连纯一数

题意:

纯一数是指十进制表示中所有数字均为1的整数,请找出第N小的可以表示为恰好三个纯一数之和的整数。

思路:

[1]由样例3得知输出数最大为1e13(及112222222233)。 [2]使用三层for循环枚举遍历出数组ans。 [3]cout<<ans[n];

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,cnt,idx,bb=1;
long long ans[30000];//答案变量
long long nums[30000]={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);	
	cin>>n;
	for(int i=1;i<=13;i++){
		for(int j=1;j<=i;j++){
			for(int k=1;k<=j;k++){
				ans[++idx]=nums[i]+nums[j]+nums[k];	//求出答案	
    		}
		}
	}
	cout<<ans[n];
	return 0;
  }
}

C. 倒立数对

题意:

给定一个正整数N,如果A的最后一位数字等于B的第一位数字,且A的第一位数字等于B的最后一位数字,求满足以上条件的正整数对(A,B)的数量.

思路:

[1]根据数学公式我们可算出cnt[i][j]*cnt[j][i]=这个区间的数。 [2]两层for循环遍历cnt[i][j]*cnt[j][i];将遍历结果加入一个答案变量中。 [3] 输出答案变量。

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int cnt[20][20];
long long ans;//答案变量
int main(){
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);	
	cin>>n;
	for(int i=1;i<=n;i++){
    int k=i;
		while(k>=10){//求出开头数字
			k/=10;
		}
		cnt[k][i%10]++;
	}
	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;
}