B.卡片
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int s[10];
bool check(int x)
{
while(x)
{
int t=x%10;//取出最后一位
x=x/10;//把最后一位更新,删掉
if(--s[t]<0)
return false;
}
return true;
}
int main()
{
for(int i=0;i<10;i++)
s[i]=2021;
for(int i=1; ;i++)
{
if(check(i)==false)
{
cout<<i-1<<endl;
return 0;
}
}
return 0;
}
C.直线
答案:40257
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;
struct Point
{
double x,y;
} point[25*25]; //存下每一个点
int res=21;
map<pair<double,double>,int> m;//存斜率k和截距b
int main()
{
int cnt=0;
for(int i=0; i<20; i++)
{
for(int j=0; j<21; j++)
{
point[cnt].x=i;
point[cnt].y=j;
cnt++;
}
}
for(int i=0; i<cnt; i++)
{
for(int j=0; j<cnt; j++)
{
double x1=point[i].x,y1=point[i].y;
double x2=point[j].x,y2=point[j].y;
//两点的直线与坐标轴平行或共点
if(x1!=x2)
{
double k=(double)(y2-y1)/(x2-x1);
double b=(double)y1-k*x1;
if(m[ {k,b}]==0)
{
m[ {k,b}]=1;
}
}
}
}
auto f = m.begin();
double firk=f->first.first;
double firb=f->first.second;
for (auto it = ++m.begin(); it != m.end(); ++it)
{
double sedk=it->first.first;
double sedb=it->first.second;
if(it->second==1)
{
if (fabs(sedk - firk) > 1e-8 || fabs(sedb - firb) > 1e-8)
{
res ++ ;
firk=it->first.first;
firb=it->first.second;
}
}
}
cout<<res<<endl;
}
D.货物摆放
暴力
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cmath>
typedef long long ll;
using namespace std;
int main()
{
ll n,res=0;
cin>>n;
for(ll i=1; i*i*i<=n; i++)
{
if(n%i==0)
{
for(ll j=i; i*j*j<=n; j++)
{
if((n/i)%j==0)
{
ll k=n/i/j;
if((n/i/j)%k==0)
{
if(i==j&&j==k) res++;
else if (i!=j&&j!=k) res+=6;
else res+=3;
cout<<res<<endl;
}
}
}
}
}
}
F.时间显示
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cmath>
typedef long long LL;
using namespace std;
int main()
{
LL t;
scanf("%lld",&t);
t=t/1000; //去掉后三位,毫秒位,1s=1000ms
t=t%(24*60*60);//去掉整天的时间
int h=t/(60*60);//算有多少个小时
t=t%3600;//去掉整小时
int m=t/60;//算有多少分钟
int s=t%60;//去掉整分钟,剩下的即是秒
printf("%02d:%02d:%02d\n",h,m,s);
}
G.砝码称重
#include <iostream>
using namespace std;
const int N=110,M=2e5+10,B=M/2;
int w[N];
bool f[N][M];
int main()
{
int n,m;
int res=0;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>w[i];
m+=w[i];
}
f[0][0+B]=true;
for(int i=1; i<=n; i++)
{
for(int j=-m; j<=m; j++)
{
//不选
f[i][j+B]=f[i-1][j+B];
//+W[i]后等于j
if(j-w[i]>=-m) f[i][j+B]=f[i][j+B]||f[i-1][j-w[i]+B];
//-W[i]后等于j
if(j+w[i]<=m) f[i][j+B]=f[i][j+B]||f[i-1][j+w[i]+B];
}
}
//从重量1开始算,重量0不算
for(int j=1; j<=m; j++)
if(f[n][j+B]==true)
res++;
cout<<res<<endl;
return 0;
}