<>A题.空间

就很坑,比赛是把int型当4bit了,其实它是4字节(B)

答案:67108864
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> using namespace std; int
main() { long long int m=256; m=m*1024*1024/4; printf("%lld",m); return 0; }
<>B题.卡片

暴力就完事了!!!,不过要确保凑数字1时,那个1用了

答案:3181
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> using namespace std; int
f[15]; int main() { for(int i=0;i<10;i++) f[i]=2021; int x=0,flag=1; while(1) {
int k=x+1; while(k) { int s=k%10; if(f[s]) { f[s]--; k/=10; } else { flag=0;
break; } } if(flag) x++; else break; } printf("%d",x); return 0; }
<>C.直线

用集合去去重,每次向集合中传入当前直线的斜率和截距。

*注:当斜率不存在时,即直线平行于y轴,特殊处理,这里斜率用无穷大表示,截距取x坐标。

答案:48953
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> #include <set> using
namespace std; #define inf 0x3f3f3f3f int main() { double i,j,k,o; set<pair<
double,double> > s; for(i=0;i<20;i++) { for(j=0;j<21;j++) { for(k=0;k<20;k++) {
for(o=0;o<21;o++) { double fz=o-j; double fm=k-i; if(fm==0) s.insert(make_pair(
inf,i)); else { double x=fz*1.0/fm; double b=j-x*i; s.insert(make_pair(x,b)); }
} } } } printf("%d",s.size()); return 0; }
<>D.货物摆放

如果直接三层for循环,肯定很长时间,所以可以先找到n=2021041820210418的所有因子,然后在暴力找。

答案:2430
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> #include <set> using
namespace std; long long int a[1000000]; int main() { long long int n=
2021041820210418,i,j,k,l=0; set<pair<long long int,long long int> > s; for(i=1;i
<=sqrt(n);i++) if(n%i==0) a[l++]=i; k=l; for(i=0;i<k;i++) a[l++]=n/a[i]; for(i=0
;i<l;i++) { for(j=0;j<l;j++) { for(k=0;k<l;k++) { if(a[i]*a[j]*a[k]==n) { s.
insert(make_pair(a[i],a[j])); } } } } printf("%lld",s.size()); return 0; }
<>E.路径

先创造距离,然后最短路算法,结果…听人家的感觉自己错了┭┮﹏┭┮…(希望路过的大佬可以指正)

答案:804804086
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> #include <set> using
namespace std; int n,dis[2050][2050],flag[2050],d[2050]; void djiesitela(int v)
{ long long int sum=0; for(int i=1;i<=n;i++) { d[i]=dis[v][i]; } flag[v]=1; for(
int i=1;i<n;i++) { int pos,minn=INT_MAX; for(int j=1;j<=n;j++) { if(minn>d[j]&&!
flag[j]) { pos=j; minn=d[j]; } } flag[pos]=1; sum+=minn; for(int j=1;j<=n;j++) {
if(dis[pos][j]<d[j]&&!flag[j]) d[j]=dis[pos][j]; } } printf("%lld",sum); } int
main() { int i,j; n=2021; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) dis[i
][j]=0; else dis[i][j]=INT_MAX; } } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i
==j) continue; if(abs(i-j)<=21) { dis[i][j]=dis[j][i]=i*j/__gcd(i,j); } } }
djiesitela(1); return 0; }
<>F.时间显示

其实年月日对时间显示一点影响都没有,只需要知道1s=1000ms,然后把毫秒转化成秒,最后通过取余确定时分秒。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> #include <set> using
namespace std; int y,m,d,h,f,mi; int main() { long long int n; scanf("%lld",&n);
y=1970,m=1,d=1,h=0,f=0,mi=0; n/=1000; int S,F,M; mi=n%60; n-=mi; n/=60; f=n%60;
n/=60; h=n%24; printf("%02d:%02d:%02d",h,f,mi); return 0; }
<>G.砝码称重

通过队列加入来算,要注意的是砝码可以进行加减,加减后的重量相当于新的砝码加入队列。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> #include <queue> using
namespace std; int flag[100010]; int main() { int n,w[150],i,j,x,sum=0; scanf(
"%d",&n); queue<pair<int,int> > q; for(i=0;i<n;i++) { scanf("%d",&w[i]); q.push(
make_pair(w[i],i)); } while(!q.empty()) { int z=q.front().first; int ii=q.front(
).second; if(!flag[z]) { flag[z]=1; sum++; } q.pop(); for(int i=ii+1;i<n;i++) {
x=abs(w[i]-z); if(!flag[x]) { sum++; flag[x]=1; } q.push(make_pair(x,i)); } for(
int i=ii+1;i<n;i++) { x=z+w[i]; if(!flag[x]) { sum++; flag[x]=1; } q.push(
make_pair(x,i)); } } printf("%d",sum); return 0; }
<>H.杨辉三角

说实话是真的狗,我推不出来规律,看到10^9数量级,我就知道,前20%吧,唯有暴力!!!o( ̄︶ ̄)o
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> #include <queue> using
namespace std; int a[10000][10000]; int main() { int n,i,j,s,flag=1; scanf("%d",
&n); if(n==1) printf("1"); else { a[0][0]=1; a[1][0]=1; a[1][1]=1; s=3; for(i=2;
;i++) { for(j=0;j<=i;j++) { if(j==0||j==i) { a[i][j]=1; s++; } else { a[i][j]=a[
i-1][j-1]+a[i-1][j]; s++; if(a[i][j]==n) { printf("%d",s); flag=0; break; } } }
if(!flag) break; } } return 0; }
<>I.双向排序

前边心态已经搞炸了,时间也不够了,就直接用最直接的方法吧,sort排序呗!!w(゚Д゚)w 后边的过多少自求多福。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #
include <string> #include <cmath> #include <algorithm> #include <queue> using
namespace std; bool cmp(int a,int b) { return a>b; } int main() { int s[100005],
n,m,a,b,i; scanf("%d%d",&n,&m); for(i=0;i<n;i++) s[i]=i+1; for(i=0;i<m;i++) {
scanf("%d%d",&a,&b); if(a==0) sort(s,s+b,cmp); else sort(s+b-1,s+n); } for(i=0;i
<n;i++) { printf("%d",s[i]); if(i!=n-1) printf(" "); } return 0; }
<>J.括号序列

写完代码后自己的样例把自己推翻了(⊙o⊙)…也是真的绝了!!

<>如有不足,望评论区指正,Thanks♪(・ω・)ノ

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信