T1

题意

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

整体思路

首先排序A,B并遍历累加求和到s1和s2。直到满足s1>X或s2>Y,最后取其最小值。

题解

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

long long n,d,g;
long long q1=0,q2=0,d1=0,o1=0;
bool cmp(int x, int y)  
{
	return x>y;
} //排序函数
long long a[200005],b[200005];//个道菜的糖咸度

int main() {
	freopen("eat.in","r",stdin);
	freopen("eat.out","w",stdout);
	cin>>n>>d>>g;
	
	for(long long i=1;i<=n;i++){
		cin>>a[i];
		
	}
	for(long long i=1;i<=n;i++){
		cin>>b[i];//TOD
	}//输入
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n+1,cmp);//调用函数cmp
	for(long long i=1;i<=n;i++){
		q1+=a[i];
		d1++;               
		if(q1>d){
			break;//
		}
	}	
	for(long long i=1;i<=n;i++){
		q2+=b[i];
		o1++;     
		if(q2>g){
			break;//TODO
		}
	}	//判断计数(错点)
	long long uq=min(d1,o1);//比大小
	cout<<uq;
	return 0;
	
	
}

T2

题意

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

整体思路

定义一个数组a={0,1,11,...},好模拟枚举纯一数; 三层for循环i,j,k。i<=13,j<=i,k<=j。i表示第一个纯一数的下标、j表示第二个纯一数的下标,k表示第三个纯一数的下标。为了不重复,j<=i并且k<=j。随后把a[i]+a[j]+a[k]录进ans[++r].这里a[i]是第一个纯一数,a[j]是第一个纯一数,a[k]是第一个纯一数,最后输出a[n]。

题解

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

long long ans[30000];
long long a[30000]= {0,1,11,111,1111,11111,111111,1111111,11111111,111111111,1111111111,11111111111,111111111111,1111111111111};
int main(){
	cin>>n;
	for(int i=1;i<=13;i++){
		for(int j=1;j<=i;j++){
			for(int k=1;k<=j;k++){
				ans[++r]=a[i]+a[j]+a[k];//循环嵌套,统计纯一数
				
				//TODO
			}//TODO
		}//TODO
	}
	cout<<ans[n];
	return 0;//
	
}

T3

题意

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

思路

1.将开头与开头,结尾与结尾相同的数字压入一个二维数组中;2.二层嵌套循环遍历满足条件的结果加人答案;

题解

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


int n;
int d[300][300];
long long ans;

int main(){
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);
	
	cin>>n;
	for(int i=1;i<=n;i++){
		string l=to_string(i);
		long long k1=l.size();
		long long k2=i;
		k1-=1;
		while(k1--){
			k2/=10;
			//TODO
		}
		d[k2][i%10]++;
		//TODO
	}
	
	for(int i=1;i<=9;i++){
		//TODO
		for(int j=1;j<=9;j++){
			//TODO
			ans=ans+d[i][j]*d[j][i];
			
		}
	}
	
	cout<<ans;
	
	
	return 0;
}