[toc]ios
<hr>数组
<font size=2 color=red>这一个题的意思就是把题目中所给的数字变成二进制的码来表示,而后每两个数字的码是在一排的.</font>spa
#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; }
<font size=2 color=red>找0的个数实际上就是找2和5的数量.</font>3d
#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; }
<font size=2 color=red>代码的大概意思就是先随机生成一个数,把比这个小的都放在它的左边,比它大的数都放在右边,这个数若是是第k小的就返回,若是小于k就再向右半部分,此时就不是第k小的了,不然就向左边去找第k小的数.`</font>指针
<font size=2 color=red>这题很差想到的就是遍历b,若是遍历a复杂度最多降到O(nlogn).</font>日志
#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; }
<font size=2 color=red>把每一圈都补成一个正方形,而后讨论点落在四个方向上的状况.</font>code
#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; }
<font size=2 color=red>blog
</font>排序
<font size=2 color=blue>咱们须要明确的是:v[i]里面的一个数就表明一个赞.</font>图片
#include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<cstring> using namespace std; typedef long long LL; const int Max_n=1005; int ans[Max_n],n,d,k;;//保存符合条件的id vector<int>v[Max_n]; bool judge(int id){ int len=v[id].size(); if(len<k) return false; sort(v[id].begin(),v[id].end());//按照时间从小到大排序 int l=0,r=0; int cnt=0;//表示目前获得的赞. while(l<=r&&r<len){//某个区间,而且右端点不能超过边界. cnt++;//若是上一步cnt<k,那么咱们r++以后cnt是要加1的. //(此时一个时间就表明一个赞)若是咱们上一步是没有找到 //合适的区间,l++,cnt--由于此时咱们的赞已经固定在k了, //因此咱们须要cnt++(增长时间间隔) if(cnt>=k){//此时赞是够的,只须要在看时间段是否符合就行. if(v[id][r]-v[id][l]<d) return true; else{//此时间间隔不知足说明左端点须要右移(缩短间隔) l++; cnt--; } } r++;//赞不够咱们增长赞,若是是由于时间间隔咱们须要右移左端点 //(由于此时咱们已经将赞固定的k个了,再日后遍历,删除一个就要增长一个) } return false;//最后没有找到合适的时间间隔 } int main(){ scanf("%d%d%d",&n,&d,&k); while(n--){ int id,ts; scanf("%d%d",&ts,&id); v[id].push_back(ts); } int num=0; for(int i=1;i<=Max_n;i++){ if(judge(i)){ ans[++num]=i; } } for(int i=1;i<=num;i++) printf("%d\n",ans[i]); return 0; }
<font size=3 color=red>此题有一个坑点,就是让求有多少岛屿被彻底淹没,而不是最终还剩下多少岛屿.</font>
#include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<cstring> #include<set> using namespace std; typedef long long LL; const int Max_n=1005; char a[Max_n][Max_n]; int vis[Max_n][Max_n],n,vis1[Max_n][Max_n]; int net[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; set<char>s; bool judge_border(int x,int y){ if(x<1||x>n||y<1||y>n) return false; return true; } void dfs(int x,int y,int color){//标记连通块 a[x][y]=color; for(int k=0;k<4;k++){ int tx=x+net[k][0]; int ty=y+net[k][1]; if(judge_border(tx,ty)&&!vis[tx][ty]&&a[tx][ty]=='#'){ vis[tx][ty]=1; dfs(tx,ty,color); } } return ; } int main(){ char cnt='0'; scanf("%d",&n); getchar(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf(" %c",&a[i][j]); for(int i=1;i<=n;i++){//求连通块而且标记 for(int j=1;j<=n;j++){ if(a[i][j]=='#'){ cnt++; dfs(i,j,cnt); } } } /* for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%c",a[i][j]); if(j==n) printf("\n"); } }*/ for(int i=1;i<=n;i++){//按照要求淹没陆地 for(int j=1;j<=n;j++){ if(a[i][j]!='.'){ for(int k=0;k<4;k++){ int tx=i+net[k][0]; int ty=j+net[k][1]; if(judge_border(tx,ty)&&a[tx][ty]=='.'){//一个陆地旁边有海洋就被淹没 vis1[i][j]=1; break; } } } } } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(vis1[i][j]) a[i][j]='.'; /*for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%c",a[i][j]); if(j==n) printf("\n"); } } */ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]!='.') s.insert(a[i][j]); printf("%d\n",cnt-'0'-s.size()); return 0; }