2017年蓝桥杯省赛
生活随笔
收集整理的這篇文章主要介紹了
2017年蓝桥杯省赛
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 承壓計算【遞推】
- 興趣小組【文件操作】
- Excel地址【進制轉換】
- 拉馬車【模擬 雙端隊列】
- 紙牌三角形【全排列】
- 外星日歷【取模】
- 青蛙跳杯子【BFS】
- 分巧克力【二分】
- 購物單【模擬】
- 日期問題【日期模擬問題】
- k倍區間【前綴和 / 取模】
- 迷宮【dfs】
- 方格分割【dfs 有意思】
- 油漆面積【掃描線】
- 9數算式【全排列】
承壓計算【遞推】
分析: 你會發現每次往下都是除以2來平分,但是無論如何也不能是題目給的那么大呀。
這說明有單位換算,但是我們并不知道單位換算是咋換算的。但是可以知道的是,最后一層的最小數和最大數的比值在那種單位下都是不變的。故可以求出最后一行的最大數和最小數的比值,以此來求出最大值。
興趣小組【文件操作】
#include<bits/stdc++.h> using namespace std; string s; map<string,int>mp; int main(void) {/*freopen("1.txt","r",stdin);while(cin>>s) {mp[s]++;}fclose(stdin);cin.clear();//當多個文件流讀入的時候freopen("2.txt","r",stdin);while(cin>>s) {mp[s]++;}fclose(stdin);cin.clear();freopen("3.txt","r",stdin);while(cin>>s) mp[s]--;int cnt=0;for(auto i=mp.begin();i!=mp.end();i++) if(i->second==2) cnt++;cout<<cnt;fclose(stdin);*/cout<<20;return 0; }Excel地址【進制轉換】
#include<bits/stdc++.h> using namespace std; char get(int x){return 'A'+(x-1+26)%26;} int n; int main(void) {while(cin>>n) {string s;while(n){int t=n%26;s=get(t)+s;n=(n-1)/26;}cout<<s<<endl;}return 0; }拉馬車【模擬 雙端隊列】
#include<bits/stdc++.h> using namespace std; string a,b; int main(void) {while(cin>>a>>b){deque<char>q1,q2,q3;for(int i=0;i<a.size();i++) q1.push_back(a[i]);for(int i=0;i<b.size();i++) q2.push_back(b[i]);int flag=0,cnt=0;map<char,int>mp;while(cnt<=1000000){if(!q1.size()||!q2.size()) break;if(!flag){if(!q1.size()) break;char c=q1.front(); q1.pop_front();if(mp[c]) {q1.push_back(c);while(q3.back()!=c) {q1.push_back(q3.back());mp[q3.back()]--;q3.pop_back();}q1.push_back(q3.back());mp[q3.back()]--;q3.pop_back();if(!q2.size()) break;}else mp[c]++,flag=1,q3.push_back(c);}else{if(!q2.size()) break;char c=q2.front(); q2.pop_front();if(mp[c]) {q2.push_back(c);while(q3.back()!=c) {q2.push_back(q3.back());mp[q3.back()]--;q3.pop_back();}q2.push_back(q3.back());mp[q3.back()]--;q3.pop_back();if(!q1.size()) break;}else mp[c]++,flag=0,q3.push_back(c);}cnt++;}if(q1.size()&&q2.size()) cout<<-1;else {while(q1.size()) cout<<q1.front(),q1.pop_front();while(q2.size()) cout<<q2.front(),q2.pop_front();}cout<<'\n';}return 0; }紙牌三角形【全排列】
#include<bits/stdc++.h> using namespace std; int a[15],cnt; map<deque<int>,int>mp; int main(void) {for(int i=0;i<9;i++) a[i]=i+1;do{int len1=a[0]+a[1]+a[2]+a[3];int len2=a[3]+a[4]+a[5]+a[6];int len3=a[0]+a[8]+a[7]+a[6];if(len1==len2&&len2==len3) cnt++;}while(next_permutation(a,a+9));cout<<cnt/6<<endl;return 0; }外星日歷【取模】
#include<bits/stdc++.h> using namespace std; //A B C D E,F G H I char a[10]={'I','A','B','C','D','E','F','G','H'}; int main(void) {string s="651764141421415346185";int n=0;for(int i=0;i<s.size();i++) n+=s[i]-'0';int ans=n%9;cout<<a[ans]<<endl;return 0; }青蛙跳杯子【BFS】
#include<bits/stdc++.h> using namespace std; string a,b; int dx[6]={-1,1,-2,2,-3,3}; int bfs() { int n=a.size();map<string,int>mp; queue<string>q; q.push(a); mp[a]=0;while(q.size()) {string s=q.front(); q.pop();if(s==b) return mp[s];int x=s.find('*');for(int i=0;i<6;i++){int tempx=x+dx[i];if(tempx<0||tempx>=n) continue;string temp=s;swap(temp[x],temp[tempx]);if(mp.count(temp)) continue;mp[temp]=mp[s]+1;q.push(temp);}} } int main(void) {while(cin>>a>>b) cout<<bfs()<<'\n';return 0; }分巧克力【二分】
#include<bits/stdc++.h> using namespace std; typedef long long int LL; const int N=1e5+10; LL a[N],b[N],n,m; bool check(int mid) {LL cnt=0;for(int i=0;i<n;i++) cnt+=(a[i]/mid)*(b[i]/mid);return cnt>=m; } int main(void) {cin>>n>>m;for(int i=0;i<n;i++) cin>>a[i]>>b[i];int l=0,r=1e9;while(l<r){int mid=l+r+1>>1;if(check(mid)) l=mid;else r=mid-1;}cout<<l;return 0; }購物單【模擬】
詳細題解
日期問題【日期模擬問題】
#include<bits/stdc++.h> using namespace std; int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int a,b,c; bool judge(int x) {if(x%400==0||(x%4==0&&x%100!=0)) return true;return false; } bool check(int s1,int s2,int s3) {if( s1==a && s2==b && s3==c ) return true;return false; } int main(void) {scanf("%d/%d/%d",&a,&b,&c);for(int i=19600101;i<=20591231;i++){int s1=i/10000;int s2=(i%10000)/ 100;int s3=i%100;if(judge(s1)) month[2]=29;if(s1>=1&&s2<=12&&s3>=1&&s3<=month[s2])if(check(s1%100,s2,s3) || check(s2,s3,s1%100) || check(s3,s2,s1%100)){printf("%04d-%02d-%02d\n",s1,s2,s3);}month[2]=28;}return 0; }k倍區間【前綴和 / 取模】
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; typedef long long int LL; LL a[N],s[N],st[N],n,k; int main(void) {cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];st[0]++;LL ans=0;for(int i=1;i<=n;i++){int t=s[i]%k;ans+=st[t];st[t]++;}cout<<ans;return 0; }迷宮【dfs】
#include<bits/stdc++.h> using namespace std; string s[10]= {"UDDLUULRUL","UURLLLRRRU","RRUURLDLRD","RUDDDDUUUU","URUDLLRRUU","DURLRLDLRL","ULLURLLRDU","RDLULLRDDD", "UUDDUDUDLL","ULRDLUURRR" }; int st[15][15],ans; void dfs(int x,int y) {if(x<0||x>9||y<0||y>9)//過界 {ans++;return;}if(st[x][y]) return;//是一個圈 st[x][y]=1;if(s[x][y]=='U') dfs(x-1,y);if(s[x][y]=='D') dfs(x+1,y);if(s[x][y]=='L') dfs(x,y-1);if(s[x][y]=='R') dfs(x,y+1); } int main(void) {for(int i=0;i<10;i++)for(int j=0;j<10;j++){memset(st,0,sizeof st);dfs(i,j);}cout<<ans;return 0; }方格分割【dfs 有意思】
#include<cstdio> #include<iostream> using namespace std; int n=6; int ans; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int vis[7][7]; void dfs(int x,int y) {if(x==0||x==6||y==0||y==6) //剪到邊就剪完了{ans++;return;}for(int i=0;i<4;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(!vis[tempx][tempy]){vis[tempx][tempy]=true;vis[n-tempx][n-tempy]=true;dfs(tempx,tempy); vis[tempx][tempy]=false;vis[n-tempx][n-tempy]=false;} } } int main(void) {vis[n/2][n/2]=true;dfs(n/2,n/2);cout<<ans/4<<endl;return 0; }油漆面積【掃描線】
暴力做法。
經典的掃描線題目
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; typedef long long int LL; int n; struct Segment {int x,y1,y2;bool operator< (const Segment &t)const{return x<t.x;}int k; }seg[N*2]; struct Node {int l,r;int cnt;//當前區間被覆蓋的次數int len;//子區間總共被覆蓋的長度 }tr[N*8]; vector<int>ys;int find(int y) {return lower_bound(ys.begin(),ys.end(),y)-ys.begin(); }void pushup(int u) {if(tr[u].cnt) tr[u].len=ys[tr[u].r+1]-ys[tr[u].l];else if(tr[u].l!=tr[u].r){tr[u].len=tr[u*2].len+tr[u*2+1].len; }else tr[u].len=0; }void build(int u,int l,int r) {tr[u]={l,r,0,0};if(l!=r){int mid=(l+r)/2;build(u*2,l,mid),build(u*2+1,mid+1,r);} }void modify(int u,int l,int r,int k) {if(l<=tr[u].l&&tr[u].r<=r){tr[u].cnt+=k;pushup(u);}else{int mid=(tr[u].l+tr[u].r)/2;if(l<=mid) modify(u*2,l,r,k);if(r>mid) modify(u*2+1,l,r,k);pushup(u);} }int main() {cin>>n;for(int i=0,j=0;i<n;i++){int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2);if(x1>x2) swap(x1,x2);if(y1>y2) swap(y1,y2);seg[j++]={x1,y1,y2,1};seg[j++]={x2,y1,y2,-1};ys.push_back(y1),ys.push_back(y2);}sort(ys.begin(),ys.end());ys.erase(unique(ys.begin(),ys.end()),ys.end());build(1,0,ys.size()-2);sort(seg,seg+n*2);int res=0;for(int i=0;i<n*2;i++){if(i>0) res+=tr[1].len*(seg[i].x-seg[i-1].x);modify(1,find(seg[i].y1),find(seg[i].y2)-1,seg[i].k);}printf("%d",res); }9數算式【全排列】
#include<bits/stdc++.h> using namespace std; int a[10],ans; bool check(int l) {int sum1=0,sum2=0;for(int i=1;i<=l;i++) sum1=sum1*10+a[i];for(int i=l+1;i<=9;i++) sum2=sum2*10+a[i];long long int sum=sum1*sum2;string s=to_string(sum);map<char,int>mp;for(int i=0;i<s.size();i++) mp[s[i]]++;if(s.size()==9&&mp.size()==9&&mp['0']==0){return true;}return false; } int main(void) {for(int i=1;i<=9;i++) a[i]=i;do{for(int j=1;j<=8;j++) if(check(j)) ans++;}while(next_permutation(a+1,a+10));cout<<ans/2;//左右交換 return 0; }總結
以上是生活随笔為你收集整理的2017年蓝桥杯省赛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Active MQ的安装
- 下一篇: 【PAT乙级题库】全套总结