- 陈俊霖 的博客
七月Day3_总结
- @ 2025-7-17 19:46:33
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;
}