Codeforces Round #354 (Div. 2) ABCD

Posted 我是阿格斯之盾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #354 (Div. 2) ABCD相关的知识,希望对你有一定的参考价值。

Codeforces Round #354 (Div. 2)

Problems
 
 
#Name  
A
standard input/output
1 s, 256 MB
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
standard input/output
3 s, 256 MB
Submit Remove from favourites  x375
E
standard input/output
1 s, 256 MB
Submit Add to favourites  x58

 

Nicholas and Permutation

题意:允许你交换一次任意两个数位置,要使最大的数和最小的数的距离最大,输出最大值

题解:

大水题,就先找到最小的和最大的,把其中一个交换到尽头。

代码:

 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

 

Pyramid of Glasses

题意:摆了一个高脚杯金字塔,每秒钟往最上面倒一整杯,一杯满了会往两边溢出流到下面两个杯子,求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

 

Vasya and String

题意:给出一个由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

 

Theseus and labyrinth

题意:给出一个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]=\'|\';
Codeforces Round #354 (Div. 2) A

Codeforces Round #354 (Div. 2)

Codeforces Round #354 (Div. 2) B. Pyramid of Glasses (模拟+思维)

Codeforces Round #354 (Div. 2) C. Vasya and String

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)