第几天(简单计算)
明码(STL专题之bitset)
这一个题的意思就是把题目中所给的数字变成二进制的码来表示,然后每两个数字的码是在一排的.
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long LL;
const int Max_n=100005;
int main(){
/* int n,m;
while(~scanf("%d%d",&n,&m)){
bitset<8>x;
x=n;
for(int i=7;i>=0;i--){
if(x[i]) printf("1");
else printf(" ");
}
x=m;
for(int i=7;i>=0;i--){
if(x[i]) printf("1");
else printf(" ");
}
printf("\n");
}*/
//上面的显示的是:九的九次方等于多少?
printf("%.0lf",pow(9,9)); //387420489
return 0;
}
乘积尾零(思维,简单计算)
找0的个数实际上就是找2和5的数量.
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long LL;
const int Max_n=30;
int a[Max_n];
int main() {
for(int i=1;i<=100;i++)
scanf("%d",&a[i]);
int num1=0;
int num2=0;
for(int i=1;i<=100;i++){
int x=a[i];
while(x%2==0&&x){
x/=2;
num1++;
}
while(x%5==0&&x){
x/=5;
num2++;
}
}
printf("%d\n",num1>num2?num2:num1);//31
return 0;
}
快速排序(找第k小的数)
代码的大概意思就是先随机生成一个数,把比这个小的都放在它的左边,比它大的数都放在右边,这个数如果是第k小的就返回,如果小于k就再向右半部分,此时就不是第k小的了,否则就向左边去找第k小的数.
递增三元组(STL专题之二分的应用)
这题不好想到的就是遍历b,如果遍历a复杂度最多降到O(nlogn).
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int Max_n=100005;
int a[Max_n],b[Max_n],c[Max_n];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
sort(a+1,a+1+n);
sort(c+1,c+1+n);
LL ans=0;
for(int i=1;i<=n;i++){
int index1=lower_bound(a+1,a+1+n,b[i])-a;
int index2=upper_bound(c+1,c+1+n,b[i])-c;
ans+=1LL*(index1-1)*(n-index2+1);
}
printf("%lld\n",ans);
return 0;
}
螺旋折线(思维,数学)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long LL;
const int Max_n=100005;
int f(int x,int y,int n){
if(x==-n){
if(y==-n)
return 8*n;//n*2*4;
return y+n;//1+(y+n-1);
}
if(y==n){
return 3*n+x;//1+2*n-1+x+n;
}
if(x==n){
return 5*n-y;//1+2*n-1+2*n+n-y;
}
if(y==-n){
return 7*n-x;//1+2*n-1+2*n+2*n+n-x;
}
}
int main(){
int x,y;
scanf("%d%d",&x,&y);
int n=max(abs(x),abs(y));
LL ans=1LL*n*(n-1)*4+f(x,y,n);
printf("%lld\n",ans);
return 0;
}