- 郭妍溪 的博客
7月DAY3
- @ 2025-7-17 21:48:43
(这次写的细一些)
A.最小贪吃量
题意:任意排序后,若前面的甜度大于X,或者前面的咸度大于Y就停止,求前面最少有多少盘。 思路:运用sort函数排序,由于排序后是由小到大,所以需要从后到前循环,并判断甜咸度,同时统计数量。 错因:忘记给过程中检验的代码加注释。 代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("eat.in","r",stdin);
freopen("eat.out","w",stdout);
long long n,x,y,c=0,s=0,m=0;
bool l=0;
cin>>n>>x>>y;
long long a[n],b[n];
for(long long i=0;i<n;i++)
{
cin>>a[i];
}
for(long long i=0;i<n;i++)
{
cin>>b[i];
}
sort(a,a+n);
sort(b,b+n);
for(int i=n-1;i>=0;i--)
{
if(l==0)
{
c+=a[i];
s+=b[i];
//cout<<a[i]<<" "<<b[i]<<endl;
if(c>x||s>y)
{
m=n-i;
l=1;
}
}
}
if(m==0)
{
cout<<n;
return 0;
}
cout<<m;
return 0;
}
B.三连纯一数
题意:找出第N小的三个由1组成的数的和。 思路:用枚举法,由于N<333所以这个数小于112222222233,所以可以用三层循环,分别找出三个数。 错因:不会,骗了几分。 代码:
#include<bits/stdc++.h>
using namespace std;
long long a[]={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);
long long n,m=0;
cin>>n;
for(long long i=1;i<=13;i++)
{
for(long long j=1;j<=i;j++)
{
for(long long l=1;l<=j;l++)
{
m++;
if(m==n)
{
cout<<a[i]+a[j]+a[l];
return 0;
}
}
}
}
return 0;
}
C.倒立数对
题意:找到N以内的两个数AB,A的最后一位数字等于B的第一位数字,且A的第一位数字等于B的最后一位数字。 思路:先统计N以内每种第一位数字和最后一位数字,再用sum统计有多少组AB(sum=sum+cnt[i][j]*cnt[j][i])。 错因:代码超时了。 代码:
#include <bits/stdc++.h>
using namespace std;
long long cnt[10][10];
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
int n,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
int x=i;
while(x>=10)
{
x=x/10;
}
cnt[x][i%10]++;
}
for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++)
{
sum=sum+cnt[i][j]*cnt[j][i];
}
}
cout<<sum;
return 0;
}
总结: 还是没好好思考,没认真写。