A. 最小贪吃量

题意:

有N道菜,第i道菜的甜度为Ai,咸度为Bi。小k可以按任意顺序排列这些菜,并按排列后的顺序依次品尝。他会按照排列顺序吃菜,但一旦已吃菜品的总甜度超过X,或者总咸度超过Y,他就会停止进食。求他最终吃下的最少可能菜数。

思路:

排序甜度,找出最小值,排序咸度,找出最小值,比较甜度最小值和咸度最小值,输出最小值

题解:

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

const int N=2e5+5;
struct aaa{
	long long a,b;
}c[N];

long long n,x,y,ans=1e9;

bool cmp1(aaa l,aaa j){
	return l.a>j.a;
}

bool cmp2(aaa l,aaa j){
	return l.b>j.b;
} 

int main(){
	freopen("eat.in","r",stdin);
	freopen("eat.out","w",stdout);
	cin>>n>>x>>y;
	for(int i=1;i<=n;i++) cin>>c[i].a;
	for(int i=1;i<=n;i++) cin>>c[i].b; 
	sort(c+1,c+n+1,cmp1);
	long long xx=0,yy=0,cnt=0;
	for(int i=1;i<=n;i++){
		xx+=c[i].a;
		cnt++;
		if(xx>x) break; 
	}
	ans=min(ans,cnt);
	sort(c+1,c+n+1,cmp2);
	xx=0,yy=0,cnt=0;
	for(int i=1;i<=n;i++){
		yy+=c[i].b;
		cnt++;
		if(yy>y) break;
	}
	ans=min(ans,cnt);
	cout<<ans;
	return 0; 
}

B. 三连纯一数

题意:

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

思路:

储存统一数,枚举

题解:

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

const int N=14;
long long n,f[N+1];

int main(){
	freopen("three.in","r",stdin);
	freopen("three.out","w",stdout);
	cin>>n;
	long long p=0;
	for(int i=0;i<=N;i++){
		f[i]=p;
		p=p*10+1;
	}
	int idx=0;
	for(int k=1;k<=N;k++){
		for(int i=1;i<=k;i++){
			for(int j=1;j<=i;j++){
				idx++;
				if(idx==n) cout<<f[k]+f[i]+f[j];
			}
		}
	}
	return 0;
}

C. 倒立数对

题意:

给定一个正整数N。求满足以下条件的正整数对(A,B)的数量(A和B都不大于N):当A和B以十进制书写且没有前导零时,A的最后一位数字等于B的第一位数字,且A的第一位数字等于B的最后一位数字。

思路:

遍历a的值,打标记,求出b,输出答案

题解:

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

const int N=2e5+5; 
long long n,ans,f[15][15];

int main(){
//	freopen("number.in","r",stdin);
//	freopen("number.out","w",stdout);
	cin>>n;
	for(int a=1;a<=n;a++){
		int x=a,y=a%10;
		while(x/10>0) x/=10;
		if(x==y) ans++;
		ans+=f[y][x]*2;
		f[x][y]++;
	}
	cout<<ans;
	return 0;
}