Codeforces Round #354 (Div. 2) ABCD
# | Name | ||
---|---|---|---|
A | x3384 | ||
B | standard input/output 1 s, 256 MB | x1462 | |
C | standard input/output 1 s, 256 MB | x1393 | |
D | x375 |
題意:允許你交換一次任意兩個數位置,要使最大的數和最小的數的距離最大,輸出最大值
題解:
大水題,就先找到最小的和最大的,把其中一個交換到盡頭。
程式碼:
1 //#pragma comment(linker, "/STACK:102400000,102400000")View Code2 #include<cstdio> 3 #include<cmath> 4 #include<iostream> 5 #include<cstring> 6 #include<algorithm> 7 #include<cmath> 8 #include<map> 9 #include<set> 10 #include<stack> 11 #include<queue> 12 using namespace std; 13 14 #defineMZ(array) memset(array, 0, sizeof(array)) 15 #define MF1(array) memset(array, -1, sizeof(array)) 16 #define MINF(array) memset(array, 0x3f, sizeof(array)) 17 #define REP(i,n) for(i=0;i<(n);i++) 18 #define FOR(i,x,n) for(i=(x);i<=(n);i++) 19 #define ROF(i,x,y) for(i=(x);i>=(y);i--) 20 #defineRD(x) scanf("%d",&x) 21 #define RD2(x,y) scanf("%d%d",&x,&y) 22 #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) 23 #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) 24 #define WN(x) printf("%d\n",x); 25 #define RE freopen("D.in","r",stdin) 26 #define WE freopen("huzhi.txt","w",stdout) 27 #define MP make_pair 28 #define PB push_back 29 #define PF push_front 30 #define PPF pop_front 31 #define PPB pop_back 32 #define lowbit(x) ((x)&(-x)) 33 template<class T>inline void OA(const T &a,const int &st,const int &ed) { 34 if(ed>=st)cout<<a[st]; 35 int i; 36 FOR(i,st+1,ed)cout<<' '<<a[i]; 37 puts(""); 38 } 39 typedef long long LL; 40 typedef unsigned long long ULL; 41 typedef pair<int,int> PII; 42 const double PI=acos(-1.0); 43 const double EPS=1e-10; 44 inline int sgn(double &x) { 45 if(fabs(x) < EPS)return 0; 46 if(x < 0)return -1; 47 else return 1; 48 } 49 const int INF=0x3f3f3f3f; 50 const int NINF=0x80000001; 51 const int MAXN=111111; 52 const int MAXM=33; 53 const int MOD = 1000000007; 54 55 56 57 int main() { 58 int i; 59 int x; 60 int q,w,n; 61 RD(n); 62 REP(i,n){ 63 RD(x); 64 if(x==n)q=i; 65 if(x==1)w=i; 66 } 67 if(q>w)swap(q,w); 68 WN(max(n-q-1, w)); 69 return 0; 70 }
題意:擺了一個高腳杯金字塔,每秒鐘往最上面倒一整杯,一杯滿了會往兩邊溢位流到下面兩個杯子,求n層高的金字塔,倒水k分鐘後,有多少杯是滿的。
題解:
直接把k分鐘的全倒進最上面的杯子,然後模擬流下去就行。
程式碼:
1 //#pragma comment(linker, "/STACK:102400000,102400000") 2 #include<cstdio> 3 #include<cmath> 4 #include<iostream> 5 #include<cstring> 6 #include<algorithm> 7 #include<cmath> 8 #include<map> 9 #include<set> 10 #include<stack> 11 #include<queue> 12 using namespace std; 13 14 #define MZ(array) memset(array, 0, sizeof(array)) 15 #define MF1(array) memset(array, -1, sizeof(array)) 16 #define MINF(array) memset(array, 0x3f, sizeof(array)) 17 #define REP(i,n) for(i=0;i<(n);i++) 18 #define FOR(i,x,n) for(i=(x);i<=(n);i++) 19 #define ROF(i,x,y) for(i=(x);i>=(y);i--) 20 #define RD(x) scanf("%d",&x) 21 #define RD2(x,y) scanf("%d%d",&x,&y) 22 #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) 23 #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) 24 #define WN(x) printf("%d\n",x); 25 #define RE freopen("D.in","r",stdin) 26 #define WE freopen("huzhi.txt","w",stdout) 27 #define MP make_pair 28 #define PB push_back 29 #define PF push_front 30 #define PPF pop_front 31 #define PPB pop_back 32 #define lowbit(x) ((x)&(-x)) 33 template<class T>inline void OA(const T &a,const int &st,const int &ed) { 34 if(ed>=st)cout<<a[st]; 35 int i; 36 FOR(i,st+1,ed)cout<<' '<<a[i]; 37 puts(""); 38 } 39 typedef long long LL; 40 typedef unsigned long long ULL; 41 typedef pair<int,int> PII; 42 const double PI=acos(-1.0); 43 const double EPS=1e-10; 44 inline int sgn(double &x) { 45 if(fabs(x) < EPS)return 0; 46 if(x < 0)return -1; 47 else return 1; 48 } 49 const int INF=0x3f3f3f3f; 50 const int NINF=0x80000001; 51 const int MAXN=111111; 52 const int MAXM=33; 53 const int MOD = 1000000007; 54 55 int n,t; 56 57 int farm(){ 58 double a[20][20]; 59 int i,j; 60 REP(i,11)REP(j,11)a[i][j]=0.0; 61 a[1][1] = t; 62 int cnt=0; 63 FOR(i,1,n){ 64 FOR(j,1,i){ 65 if(a[i][j]>1.0){ 66 double t = (a[i][j] - 1.0)/2.0; 67 a[i+1][j] += t; 68 a[i+1][j+1] += t; 69 a[i][j]=1.0; 70 } 71 if(a[i][j]>=1.0)cnt++; 72 } 73 } 74 // FOR(i,1,n){ 75 // FOR(j,1,i){ 76 // printf("%f ",a[i][j]); 77 // } 78 // puts(""); 79 // } 80 return cnt; 81 } 82 83 int main() { 84 int i; 85 RD2(n,t); 86 WN(farm()); 87 return 0; 88 }View Code
題意:給出一個由a和b兩個字母組成的字串,最多修改其中k個,使得其中最長的連續同一字母子串最長,求最長的長度。
題解:
用雙端佇列,以a為本體掃一遍,再以b為本體掃一遍。以a為本體的時候,掃到b的話,就加到雙端佇列裡,如果雙端佇列裡超過k個,就從左端彈出,保持裡面剩k個。記錄全a子序列的區間左端,彈出的時候更新 區間左端L = 彈出的元素的位置+1。時刻更新ans = max(ans , R-L+1),R為當前掃到的位置。
只用掃兩遍,O(n)。
程式碼:
1 //#pragma comment(linker, "/STACK:102400000,102400000") 2 #include<cstdio> 3 #include<cmath> 4 #include<iostream> 5 #include<cstring> 6 #include<algorithm> 7 #include<cmath> 8 #include<map> 9 #include<set> 10 #include<stack> 11 #include<queue> 12 using namespace std; 13 14 #define MZ(array) memset(array, 0, sizeof(array)) 15 #define MF1(array) memset(array, -1, sizeof(array)) 16 #define MINF(array) memset(array, 0x3f, sizeof(array)) 17 #define REP(i,n) for(i=0;i<(n);i++) 18 #define FOR(i,x,n) for(i=(x);i<=(n);i++) 19 #define ROF(i,x,y) for(i=(x);i>=(y);i--) 20 #define RD(x) scanf("%d",&x) 21 #define RD2(x,y) scanf("%d%d",&x,&y) 22 #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) 23 #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) 24 #define WN(x) printf("%d\n",x); 25 #define RE freopen("D.in","r",stdin) 26 #define WE freopen("huzhi.txt","w",stdout) 27 #define MP make_pair 28 #define PB push_back 29 #define PF push_front 30 #define PPF pop_front 31 #define PPB pop_back 32 #define lowbit(x) ((x)&(-x)) 33 template<class T>inline void OA(const T &a,const int &st,const int &ed) { 34 if(ed>=st)cout<<a[st]; 35 int i; 36 FOR(i,st+1,ed)cout<<' '<<a[i]; 37 puts(""); 38 } 39 typedef long long LL; 40 typedef unsigned long long ULL; 41 typedef pair<int,int> PII; 42 const double PI=acos(-1.0); 43 const double EPS=1e-10; 44 inline int sgn(double &x) { 45 if(fabs(x) < EPS)return 0; 46 if(x < 0)return -1; 47 else return 1; 48 } 49 const int INF=0x3f3f3f3f; 50 const int NINF=0x80000001; 51 const int MAXN=111111; 52 const int MAXM=33; 53 const int MOD = 1000000007; 54 55 int n,k; 56 char s[MAXN]; 57 58 int gank(char c){ 59 deque<int> d; 60 int l=0; 61 int cnt=0; 62 int re=0; 63 int i; 64 REP(i,n){ 65 if(s[i]==c){ 66 d.push_back(i); 67 if(cnt==k){ 68 l = d.front() + 1; 69 d.pop_front(); 70 }else cnt++; 71 } 72 re = max(re, i-l+1); 73 } 74 return re; 75 } 76 77 int farm(){ 78 return max(gank('a'), gank('b')); 79 } 80 81 int main() { 82 int i; 83 RD2(n,k); 84 scanf(" %s",s); 85 WN(farm()); 86 return 0; 87 }View Code
題意:給出一個n*m的地圖,英雄從(xt,yt)出發,要到達敵人所在地(xm,ym)。地圖每個格子有設定:
^>v<代表向箭頭方向有門,其他方向沒門;
URDL代表某個方向沒門,其他方向都有門,例如U,代表上面沒門,其他3個方向各有一個門。
-|代表左右有門、上下有門。
+代表4個門,*代表沒有門。
每分鐘,英雄可以進行一項操作:
A.將所有方塊順時針轉90度。
B.移動到相鄰方塊,要求自己方塊到它的方向有門,它的方塊到自己的方向也有門。
給出地圖、英雄位置、敵人位置,求英雄到達敵人的最少分鐘數,或者不能到達輸出-1。
題解:
走迷宮,典型的廣搜題。廣搜每個節點有5種擴充套件:旋轉90度、往4個方向走。注意記錄某個點是否走過,需要save[x][y][z],x,y為該點座標,z為旋轉的次數,z<=3。
比較難寫的是判斷某個點能否向某個方向走一步,可以寫到一個函式裡can(x,y,z,j),(x,y)為當前座標,z為當前旋轉了幾次(0~3),j為方向,我設定方向0123代表上右下左。
方塊旋轉、門的位置可以預處理,記到一個數組裡,例如rot['<'][2] = '>',代表<符號旋轉2次得到>符號。
例如door['-'] = "0101",代表-符號的門開在右、左。
這塊寫好了就無敵了。
我就寫錯了一個符號,臥槽,就一直wa6,比賽結束以後發現一個-寫成了|,改了就過了。這種題要認真點寫啊。
(可惡,剛才看官方題解,哇,直接預處理出4種方向的地圖,a[x][y][z],就是簡單的三維地圖bfs了,臥槽,我怎麼沒想到)
程式碼:
1 //#pragma comment(linker, "/STACK:102400000,102400000") 2 #include<cstdio> 3 #include<cmath> 4 #include<iostream> 5 #include<cstring> 6 #include<algorithm> 7 #include<cmath> 8 #include<map> 9 #include<set> 10 #include<stack> 11 #include<queue> 12 using namespace std; 13 14 #define MZ(array) memset(array, 0, sizeof(array)) 15 #define MF1(array) memset(array, -1, sizeof(array)) 16 #define MINF(array) memset(array, 0x3f, sizeof(array)) 17 #define REP(i,n) for(i=0;i<(n);i++) 18 #define FOR(i,x,n) for(i=(x);i<=(n);i++) 19 #define ROF(i,x,y) for(i=(x);i>=(y);i--) 20 #define RD(x) scanf("%d",&x) 21 #define RD2(x,y) scanf("%d%d",&x,&y) 22 #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) 23 #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w) 24 #define WN(x) printf("%d\n",x); 25 #define RE freopen("D.in","r",stdin) 26 #define WE freopen("huzhi.txt","w",stdout) 27 #define MP make_pair 28 #define PB push_back 29 #define PF push_front 30 #define PPF pop_front 31 #define PPB pop_back 32 #define lowbit(x) ((x)&(-x)) 33 template<class T>inline void OA(const T &a,const int &st,const int &ed) { 34 if(ed>=st)cout<<a[st]; 35 int i; 36 FOR(i,st+1,ed)cout<<' '<<a[i]; 37 puts(""); 38 } 39 typedef long long LL; 40 typedef unsigned long long ULL; 41 typedef pair<int,int> PII; 42 const double PI=acos(-1.0); 43 const double EPS=1e-10; 44 inline int sgn(double &x) { 45 if(fabs(x) < EPS)return 0; 46 if(x < 0)return -1; 47 else return 1; 48 } 49 const int INF=0x3f3f3f3f; 50 const int NINF=0x80000001; 51 const int MAXN=1111; 52 const int MAXM=33; 53 const int MOD = 1000000007; 54 const int gx[4] = {-1,0,1,0}; 55 const int gy[4] = {0,1,0,-1}; 56 int n,m; 57 char s[MAXN][MAXN]; 58 int xt,yt,xm,ym; 59 60 int save[MAXN][MAXN][4]; 61 char rota[222][4]; 62 char door[222][5]; 63 void init() { 64 int i,j; 65 MF1(save); 66 REP(i,4) { 67 rota['+'][i]='+'; 68 rota['*'][i]='*'; 69 } 70 for(i=0; i<4; i+=2) { 71 rota['-'][0+i]='-'; 72 rota['|'][0+i]='|'; 73 rota['-'][1+i]='|'; 74 rota['|'][1+i]='-'; 75 } 76 char q[5] = "^>v<"; 77 char w[5] = "URDL"; 78 REP(i,4) { 79 REP(j,4) { 80 int l=(i+j)%4; 81 rota[q[i]][j] = q[l]; 82 rota[w[i]][j] = w[l]; 83 } 84 } 85 REP(i,4) { 86 door['+'][i]='1'; 87 door['*'][i]='0'; 88 door['|'][i]=door['-'][i]='0'; 89 } 90 door['|'][0]=door['|'][2] = '1'; 91 door['-'][1]=door['-'][3] ='1'; 92 REP(i,4)REP(j,4) { 93 door[q[i]][j]='0'; 94 door[w[i]][j]='1'; 95 } 96 REP(i,4) { 97 door[q[i]][i]='1'; 98 door[w[i]][i]='0'; 99 } 100 } 101 102 char rot(char x, int n) { 103 return rota[x][n%4]; 104 } 105 106 bool cango(char now , char next, int j) { 107 int k = (j+2)%4; 108 // door[now][4]='\0'; 109 // door[next][4]='\0'; 110 // printf("%c,%c,%s,%s,%d,%d,%c,%c\n",now,next,door[now],door[next],j,k,door[now][j],door[next][k]); 111 if (door[now][j]=='1' && door[next][k]=='1')return true; 112 else return false; 113 } 114 115 bool can(int x,int y,int z,int j) { 116 int xx=x+gx[j]; 117 int yy=y+gy[j]; 118 if(xx<0 || xx>=n || yy<0 || yy>=m)return false; 119 char now = s[x][y]; 120 char next = s[xx][yy]; 121 // printf("%c,%c %d->",now,next,z); 122 now = rot(now, z); 123 next = rot(next,z); 124 // printf("%c,%c\n",now,next); 125 if(cango(now,next,j))return true; 126 else return false; 127 } 128 129 struct Node { 130 int x,y,z; 131 int step; <