[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; }