空间
67,108,864
卡片
#include<iostream>
using namespace std;
int main(){
int ans=0,flag=1;
int t;
int a[10];
for(int i=0;i<=9;i++){
a[i]=2021;
}
for(int n=1;flag==1;n++){
t=n;
while(t!=0){
a[t%10]--;
if(a[t%10]<0){
flag=0;
break;
}
t/=10;
}
ans=n;
}
cout<<ans-1;
}
3181
直线
- 数组的定义要写到main函数的外面,因为main函数内部是栈区,内存是比较小的,函数外部是数据区,内存是比较大的。
这题让我在考场可能不一定写的出来,有一个精度处理的问题,这次学到了。
#include <iostream>
#include <cstring>
#include <algorithm>
#include "cmath"
using namespace std;
pair<double,double>l[200000];
int main(){
int n=0;
for(int x1=0;x1<=19;x1++){
for(int y1=0;y1<=20;y1++){
for(int x2=0;x2<=19;x2++){
for(int y2=0;y2<=20;y2++){
if(x1!=x2){
double k=double((y2-y1))/double((x2-x1));
double b=y1-k*x1;
l[n++]={k,b};
}
}
}
}
}
//精度处理
sort(l,l+n);
int ans=1;
for(int i=1;i<n;i++){
if(fabs(l[i].first-l[i-1].first>1e-8)||fabs(l[i].second-l[i-1].second)>1e-8){
ans++;
}
}
cout<<ans+20;//加上斜率不存在的20条线
return 0;
}
货物摆放
- 注意数字过大要开long long
首先找出大数的所有因数,然后暴力。
#include<iostream>
using namespace std;
long long n=2021041820210418;
long long d[100000];
int main(){
int ans=0;
long long x=0;
for(long long i=1;i*i<=n;i++){
if(n%i==0){
d[x++]=i;
if(i*i!=n){
d[x++]=n/i;
}
}
}
for(long long i=0;i<=x;i++){
for(long long j=0;j<=x;j++){
for(long long k=0;k<=x;k++){
if (d[i]*d[j]*d[k]==n){
ans++;
}
}
}
}
cout<<ans;
return 0;
}
路径
一开始把最小公倍数算法写错了导致算错,用dp写的,不算很难。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int n,int m){
return m==0?n:gcd(m,n%m);
}
int lcm(int n,int m){
return n*m/gcd(n,m);
}
#define N 2021
#define INT_MAX 2147483647
int dp[N+5];
int i,t,m;
int main(){
dp[1]=0;
dp[2]=2;
for(i=3;i<=N;i++){
m=INT_MAX;
t=i-1;
while(t>0&&(i-t)<=21){
m=min(dp[t]+lcm(i,t),m);
t--;
}
dp[i]=m;
}
cout<<dp[N];
}
//10266837
时间显示
犯的几点错误
- 复制到提交时太急了,头文件没复制进去
- 1秒是1000毫秒,常识记不住
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int m,h,min,sec;
long long n;
cin>>n;
n/=1000;
n=n%(3600*24);
sec=n%60;
n-=sec;
n/=60;
min=n%60;
n-=min;
n/=60;
h=n;
if(h<10)cout<<0;
cout<<n<<":";
if(min<10)cout<<0;
cout<<min<<":";
if(sec<10)cout<<0;
cout<<sec;
return 0;
//1618708103123
}
砝码称重
很有意思的一道题目
可以像背包问题一样考虑,每新增一个砝码
- 砝码自身
- 与前一状态的每种相加
- 与前一状态的每种相减取绝对值
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
int main(){
int n,x1,x2;
scanf("%d",&n);
vector<int>w(n);
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
}
set<int>s,s1;
s.insert(w[0]);
for(int i=1;i<n;i++){
s1.insert(w[i]);
for(auto it=s.begin();it!=s.end();it++){
x1=abs(w[i]-*it);
x2=abs(w[i]+*it);
if(x1>0){
s1.insert(x1);
}
if(x2>0){
s1.insert(x2);
}
}
for(auto it=s1.begin();it!=s1.end();it++){
s.insert(*it);
}
s1.clear();
}
cout<<s.size();
}
杨辉三角
空间超了,这个程序十个能过4个
vector<vector<int> >a;
要有空格隔开,不然会报编译错误直接寄
#include<iostream>
#include<vector>
using namespace std;
int n=0;
vector<vector<int> >a;
int main(){
int N,ans;
int flag=1;
cin>>N;
while(flag){
if(N==1){
ans=1;
break;
}
vector<int>b;
for(int i=0;i<=n;i++){
if(i==0||i==n)b.push_back(1);
else b.push_back(a[1][i-1]+a[1][i]);
if(b[i]==N){
ans=n*(n+1)/2+i+1;
flag=0;
break;
}
}
if(a.size()==2){
a.erase(a.begin());
}
a.push_back(b);
n++;
}
cout<<ans;
return 0;
}
/*
for(int i=0;i<=n;i++){
cout<<b[i]<<" ";
}
cout<<endl;*/
双向排序
需要用到自定义排序方式
这题因为看错题目卡了很久
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
vector<int>a(n);
for(int i=0;i<n;i++){
a[i]=i+1;
}
vector<vector<int> >d(m,vector<int>(2));
for(int i=0;i<m;i++){
scanf("%d%d",&d[i][0],&d[i][1]);
}
for(int i=0;i<m;i++){
if(d[i][0]==0){
sort(a.begin(),a.begin()+d[i][1],cmp);
}
else{
sort(a.begin()+d[i][1]-1,a.end());
}
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
/*
3 3
0 3
1 2
0 2
*/
括号序列
难,摆