- 黄乾峻 的博客
7月Day3
- @ 2025-7-17 19:46:28
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;
}