就很坑,比赛是把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; }
暴力就完事了!!!,不过要确保凑数字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; }
用集合去去重,每次向集合中传入当前直线的斜率和截距。
*注:当斜率不存在时,即直线平行于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; }
如果直接三层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; }
先创造距离,然后最短路算法,结果…听人家的感觉自己错了┭┮﹏┭┮…(希望路过的大佬可以指正)
答案: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; }
其实年月日对时间显示一点影响都没有,只需要知道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; }
通过队列加入来算,要注意的是砝码可以进行加减,加减后的重量相当于新的砝码加入队列。
#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; }
说实话是真的狗,我推不出来规律,看到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; }
前边心态已经搞炸了,时间也不够了,就直接用最直接的方法吧,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; }
写完代码后自己的样例把自己推翻了(⊙o⊙)…也是真的绝了!!