- 向彧 的博客
7月Dey-3
- @ 2025-7-17 18:37:55
A. 最小贪吃量
题意:
输入N,X,Y。并输入甜度与咸度数组求最终吃下的最少可能菜数。
思路:
[1]sort从大到小排序A与B。 [2]for循环遍历A与B求出A与B能吃的数量cnt1与cnt2。 [3]ans=min(cnt1,cnt2).
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,x,y;
long long a[200005],b[200005];
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排序
sort(b+1,b+n+1,cmp);
long long cnt1=0,cnt2=0;
long long xx=0,yy=0;
for(int i=1;i<=n;i++){//循环遍历
if(xx<=x){
xx+=a[i];
cnt1++;
}
}
for(int i=1;i<=n;i++){
if(yy<=y){
yy+=b[i];
cnt2++;
}
}
long long g=min(cnt1,cnt2);
cout<<g;
return 0;
}
}
B. 三连纯一数
题意:
纯一数是指十进制表示中所有数字均为1的整数,请找出第N小的可以表示为恰好三个纯一数之和的整数。
思路:
[1]由样例3得知输出数最大为1e13(及112222222233)。 [2]使用三层for循环枚举遍历出数组ans。 [3]cout<<ans[n];
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,cnt,idx,bb=1;
long long ans[30000];//答案变量
long long nums[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++){
ans[++idx]=nums[i]+nums[j]+nums[k]; //求出答案
}
}
}
cout<<ans[n];
return 0;
}
}
C. 倒立数对
题意:
给定一个正整数N,如果A的最后一位数字等于B的第一位数字,且A的第一位数字等于B的最后一位数字,求满足以上条件的正整数对(A,B)的数量.
思路:
[1]根据数学公式我们可算出cnt[i][j]*cnt[j][i]=这个区间的数。 [2]两层for循环遍历cnt[i][j]*cnt[j][i];将遍历结果加入一个答案变量中。 [3] 输出答案变量。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int cnt[20][20];
long long ans;//答案变量
int main(){
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
int k=i;
while(k>=10){//求出开头数字
k/=10;
}
cnt[k][i%10]++;
}
for(int i=1;i<=9;i++){//循环遍历出答案
for(int j=1;j<=9;j++){
ans+=cnt[i][j]*cnt[j][i];
}
}
cout<<ans;//输出
return 0;
}