1. 程式人生 > >Codeforces Round #354 (Div. 2) ABCD

Codeforces Round #354 (Div. 2) ABCD

Problems
#Name
A Submit Add to favourites  x3384
B standard input/output 1 s, 256 MB Submit Add to favourites  x1462
C standard input/output 1 s, 256 MB Submit Add to favourites  x1393
D Submit Remove from favourites  x375

題意:允許你交換一次任意兩個數位置,要使最大的數和最小的數的距離最大,輸出最大值

題解:

大水題,就先找到最小的和最大的,把其中一個交換到盡頭。

程式碼:

 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 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 }
View Code

題意:擺了一個高腳杯金字塔,每秒鐘往最上面倒一整杯,一杯滿了會往兩邊溢位流到下面兩個杯子,求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;
<