1.空间
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll sum;
sum=256*1024*1024*8/32;
cout<<sum<<endl;
return 0;
}
2.卡片
模拟一下,最后是不能拼出的前一个数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[10];
int main(){
for(int i=0;i<=9;i++) a[i]=2021;
int flag=0;
for(int i=1;i<=100000;i++){
int x=i;
while(x){
a[x%10]--;
if(a[x%10]<0){flag=1;break;}
x/=10;
}
if(flag) { cout<<i-1<<endl;break;}
}
return 0;
}
3.直线
枚举一下所有每两个点的那条直线,存到node里面然后排序判断一下精度是否符合,最后加上由于(x1!=x2)前面筛掉的21条直线,就好啦
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double eps=1e-8;
const int maxn=1e6+86;
struct node{
double k,b;
bool operator<(const node &ths) const {
if(k!=ths.k) return k<ths.k;
return b<ths.b;
}
}a[maxn];
int main(){
int cnt=0;
for(int x1=0;x1<20;x1++){
for(int y1=0;y1<21;y1++){
for(int x2=0;x2<20;x2++){
for(int y2=0;y2<21;y2++){
if(x1!=x2){double k=(double)(y2-y1)/(x2-x1);
double b=(double)y1-k*x1;
a[++cnt]={k,b};}
}
}
}
}
sort(a+1,a+cnt+1);
cout<<cnt<<endl;
int ans=0;
for(int i=1;i<=100;i++) cout<<a[i].k<<" "<<a[i].b<<endl;
for(int i=1;i<cnt;i++){
if(abs(a[i].k-a[i+1].k)>eps||abs(a[i].b-a[i+1].b)>eps) ans++;
}
cout<<ans+21<<endl;
return 0;
}
4.货物摆放
把所有n的因子全部求出来,不断枚举三个因子是否相乘可以等于n,把答案都加起来就好啦
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll>se;
int main(){
ll n=2021041820210418;
for(ll i=1;i*i<=n;i++){
if(n%i==0){
se.insert(i);
if(n/i!=i) se.insert(n/i);
}
}
int ans=0;
for(auto a:se){
for(auto b:se){
for(auto c:se){
if(a*b*c==n) ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
5.最短路径
后悔哭了~板子记不住
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2050;
ll dis[maxn][maxn];
struct node{
ll to,dis;
};
vector<node>g[maxn];
struct edge{
ll id,dis;
bool operator<(const edge&ths)const {
return dis>ths.dis;
}
};
priority_queue<edge>qwq;
int vis[maxn];
void dijkstra(int n){
qwq.push({n,0});
while(!qwq.empty()){
edge now=qwq.top();
qwq.pop();
if(vis[now.id]) continue;
for(int i=0;i<g[now.id].size();i++){
if(dis[n][g[now.id][i].to]>now.dis+g[now.id][i].dis){
dis[n][g[now.id][i].to]=now.dis+g[now.id][i].dis;
qwq.push({g[now.id][i].to,dis[n][g[now.id][i].to]});
}
}
vis[now.id]=1;
}
}
int main(){
for(ll i=1;i<=2021;i++){
for(ll j=i+1;j<=i+21;j++){
if(j>2021) break;
ll val=i*j/(__gcd(i,j));
g[i].push_back({j,val});
g[j].push_back({i,val});
}
}
for(int i=1;i<=2021;i++){
for(int j=1;j<=2021;j++){
dis[i][j]=1e9;
}
}
dijkstra(1);
cout<<dis[1][2021]<<endl;
return 0;
}
6.时间显示
小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。
小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
舍去毫秒,再随便搞一下就出来了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2050;
int main(){
ll n;
scanf("%lld",&n);
n/=1000;
n%=86400;
int h=n/3600;
n%=3600;
int m=n/60;
int s=n%60;
printf("%02d:%02d:%02d",h,m,s);
//新学到的关于补前导零的简洁方法
return 0;
}
7.砝码称重
你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,⋅⋅⋅,WN。
请你计算一共可以称出多少种不同的正整数重量?
注意砝码可以放在天平两边。
输入格式
输入的第一行包含一个整数 N。
第二行包含 N 个整数:W1,W2,W3,⋅⋅⋅,WN。
输出格式
输出一个整数代表答案。
数据范围
对于 50% 的评测用例,1≤N≤15。
对于所有评测用例,1≤N≤100,N 个砝码总重不超过 105。
解题思路:非常的像背包的那个状态,定义dp[ i ][ j ]为当前状态下,j为能达到的重量,判断是否可以达到j这个状态,对于一个砝码可以有三种状态,不取,放左边,或者放右边,那就可以解决了。
#include<iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1e5+86;
int a[maxn];
int dp[120][200086];
int main(){
int n,sum=0;
cin>>n;
dp[0][0]=1;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
for(int i=1;i<=n;i++){
for(int j=0;j<=sum;j++){
dp[i][j]=(dp[i-1][j]||dp[i-1][j+a[i]]||dp[i-1][abs(j-a[i])]);
}
}
int ans=0;
for(int i=1;i<=sum;i++){
if(dp[n][i]) ans++;
}
cout<<ans<<endl;
return 0;
}