T1 最小贪吃量

题意:给定N道菜,每道菜有甜度A[i]和咸度B[i]。小k可以任意排列这些菜并按顺序品尝,但一旦已吃菜品的总甜度超过X或总咸度超过Y,他就会停止进食。目标是求出小k最终吃下的最少可能菜数。 思路:首先读取输入的N、X、Y以及每道菜的甜度A[i]和咸度B[i]。为了最小化吃下的菜数,可以先对菜品按甜度A[i]从小到大排序,若甜度相同则按咸度B[i]从小到大排序。从甜度最小的菜品开始尝试加入,同时记录当前的总甜度和总咸度。一旦总甜度超过X或总咸度超过Y,停止加入菜品,并记录当前已加入的菜品数量。由于菜品是按甜度排序后依次加入的,因此得到的菜品数量即为最少可能菜数。 代码:

#include<bits/stdc++.h>
using namespace std;
long long n,x,y;
long long a[200010],b[200010];
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(b+1,b+n+1,cmp);
	long long c1=0,c2=0;
	long long s1=0,s2=0;
	for(int i=1;i<=n;i++){
		if(s1<=x){
			s1+=a[i];
			c1++;
		}
	}
	for(int i=1;i<=n;i++){
		if(s2<=y){
			s2+=b[i];
			c2++;
		}
	}
	long long g=min(c1,c2);
	cout<<g;
	return 0;
  }

T2 三连纯一数

题意:本题要求找出第N小的整数,该整数可以恰好表示为三个纯一数之和。 思路‌:首先生成一系列纯一数,如1, 11, 111, 1111等,直到满足题目需求为止。使用三重循环遍历所有可能的三个纯一数组合,计算它们的和。对于每个组合的和,使用一个集合或字典来记录这些和出现的次数,以便后续排序。将所有和进行排序,找到第N小的符合条件的整数并输出。 代码:

#include<bits/stdc++.h>
using namespace std;
long long n,d=1;
long long a[30000];
long long s[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++){
				a[d++]=s[i]+s[j]+s[k];	
			}
		}
	}
	cout<<a[n];
	return 0;
  }

T3 倒立数对

题意:给定一个正整数𝑁需要找出所有满足以下条件的正整数对(𝐴,𝐵)的数量,其中𝐴和𝐵都不大于𝑁,𝐴最后一位数字等于𝐵 的第一位数字。𝐴 的第一位数字等于 𝐵 的最后一位数字。 思路‌:从1到𝑁遍历所有可能的𝐴和𝐵的值。对于每个𝐴,提取其最后一位数字;对每个𝐵,提取其第一位数字。检查𝐴的最后一位数字是否等于𝐵的第一位数字,同时检查𝐴的第一位数字是否等于𝐵的最后一位数字。如果一对(𝐴,𝐵)满足上述两个条件,则计数加一。遍历结束后,输出满足条件的整数对的总数。 代码:

#include<bits/stdc++.h>
using namespace std;
int main() {
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);
    int N;
    cin>>N;
    vector<vector<long long>>freq(10, vector<long long>(10,0));  
    for(int x=1;x<=N;x++){
        string s=to_string(x);
        int first=s[0]-'0';   
        int last=s.back()-'0'; 
        freq[first][last]++;     
    }
    long long count=0;
    for(int i=1;i<=9;i++){   
        for(int j=0;j<=9;j++){   
            count+=freq[i][j]*freq[j][i];  
        }
    }
    cout<<count<<endl;
    return 0;
}