考查计算机的基础知识,1m=1024kb,1kb=1024b,b是字节的单位,1字节=8位。32位即为4个字节。
#include
using namespace std;
int main(){
cout<<256*1024*1024/4;
return 0;
}
没有什么思路,2021张减到0时,求这一过程。
#include
using namespace std;
int a[10];
int flag=0;
int main(){
for(int i=0;i<10;i++){
a[i]=2021;
}
for(int i=1;;i++){
int temp=i;
while(temp){
if(a[temp%10]==0){
flag=1;
break;
}
a[temp%10]--;
temp=temp/10;
}
if(flag==1){
cout<
我是用斜率做的,但是,可能会有一点差错,毕竟是除法。
#include
#include
#include
#include
using namespace std;
int n;
typedef struct pair {
double k;
double b;
}PII;
bool cmp(PII p1,PII p2){
return p2.k > p1.k;
}
vector l;
int main()
{
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 = y1 - k * x1;
l.push_back({k,b});
}
sort(l.begin(), l.end(),cmp);
int res = 1;
for (int i = 1; i < l.size(); i ++ )
if (fabs(l[i].k - l[i - 1].k) > 1e-8 || fabs(l[i].b - l[i - 1].b) > 1e-8)
res ++ ;
cout << res + 20 << endl;
return 0;
}
求出n的所有的约数。。然后三重循环,注意:求约数的时候应该稍微地减少时间的复杂度。
#include
#include
#include
using namespace std;
long long n=2021041820210418;
vector a;
int cnt;
int main(){
//首先求出n的所有的约数
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){
a.push_back(i);
}
if(n%i==0&&n/i!=i)
a.push_back(n/i);
}
for(int i=0;i
由于涉及到图论的知识,我目前还没有复习。
有手就行,没什么思路,注意:%02d表示的是如果少于两位则用零来补充。
#include
#include
#include
using namespace std;
long long ms;
long long h,m,s;
int main(){
cin>>ms;
s=ms/1000;
s=s%(24*3600);
h=s/3600;
m=(s-h*3600)/60;
s=s-h*3600-m*60;
printf("%02d:%02d:%02d\n",h,m,s);
return 0;
}
dp,dfs,如果实在是不会,就跳过吧。
#include
using namespace std;
int n;
int a[100001];
bool st[100001];
int res;
void dfs(int u,int sum){
if(u==n){
if(sum>0&&st[sum]!=true){
res++;
st[sum]=true;
}
return;
}
dfs(u+1,sum); //不选
dfs(u+1,sum+a[u]);
dfs(u+1,sum-a[u]);
}
int main(){
cin>>n;
for(int i=0;i>a[i];
}
dfs(0,0);
cout<
#include
using namespace std;
int f[110][100001];
int n;
int w;
int nums[110];
int res;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>nums[i];
w+=nums[i];
}
f[0][0]=1; //刚开始什么都没选表示只有一种方案。
for(int i=1;i<=n;i++){
for(int j=0;j<=w;j++){
f[i][j]=f[i-1][j]||f[i-1][j+nums[i]]||f[i-1][abs(j-nums[i])]; //三者只要有一个存在,则f[i][j]存在。
}
}
for(int i=1;i<=w;i++){
if(f[n][i]!=0){
res++;
}
}
cout<
比赛的时候优先使用打表法,可以骗走一半的分,第二种方法比较难想。
#include
using namespace std;
int a[1001][1001];
int n;
int res;
int flag=0;
int main(){
scanf("%d",&n);
for(int i=0;i<1001;i++){
a[i][i]=1;
a[i][0]=1;
}
for(int i=1;i<1001;i++){
for(int j=1;j<=i;j++){
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
for(int i=0;i<1001;i++){
for(int j=0;j<=i;j++){
res++;
if(a[i][j]==n){
cout<
#include
using namespace std;
const int N = 1000;
typedef long long LL;
LL n, r, c;
long long C(int a,int b){
long long res=1;
for(int i=a-b+1,j=1;i<=a&&j<=b;i++,j++){
res=res*i/j;
}
return res;
}
bool check(long long k){
long long l = 2 * k, r = n;
while(l < r){
int mid = (l + r) >> 1;
if(n <= C(mid, k)) r = mid;
else l = mid + 1;
}
if(C(l, k) == n){
cout<> n;
if(n==1){
cout<<1;
}
for(int i = 16; i >= 1; i--)
if(check(i))
break;
return 0;
}
直接用sort()方法来骗分。
#include
#include
using namespace std;
int n,m;
int a[100001];
int p,q;
bool cmp(int x,int y){
return x>y;
}
int main(){
cin>>n>>m;
for(int i=0;i>p>>q;
if(p==1){
sort(a+q-1,a+n);
}
else{
sort(a,a+q,cmp);
}
}
for(int i=0;i
不会做。。好难。。