Codeforces Round #293 (Div. 2)

 A Vitaly and Strings

题意:给定长度相等的字符串s,t,且s的字典序小于t,求一个字符串q字典序大于s小于t。

分析:将字符串看做26进制的数,对s”+1“即可。

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define esp 1e-14
#define lson   l, m, rt<<1
#define rson   m+1, r, rt<<1|1
#define low(x) ((x)&(-(x)))
#define sz(x) ((int)((x).size()))
#define pf(x) ((x)*(x))
#define pb push_back
#define pi acos(-1.0)
#define in freopen("solve_in.txt", "r", stdin);
#define bug(x) printf("Line : %u >>>>>>\n", (x));
#define TL cerr << "Time elapsed: " << (double)clock() / CLOCKS_PER_SEC * 1000 << " ms" << endl;
#define inf 0x0f0f0f0f
using namespace std;
typedef long long LL;
typedef unsigned US;
typedef pair<int, int> PII;
typedef map<PII, int> MPS;
typedef MPS::iterator IT;

char sa[111], sb[111];
int main(){
//    in
    cin >> sa >> sb;
    int n = strlen(sa);
    int ok = 0;
    for(int i = n-1; i >= 0; i--){
        if(sa[i] != ‘z‘) {
            sa[i] = sa[i] + 1;
            ok = 1;
            break;
        }else sa[i] = ‘a‘;
    }
    if(ok) {
        ok = strcmp(sa, sb) < 0;
    }
    if(ok) cout << sa << endl;
    else puts("No such string");
    return 0;
}

B Tanya and Postcard

题意:给定s和t,t的长度>=s,t中选出一些字符构成一个字符串,要求对应位置和s完全相同的尽量多,

然后剩下的要求对应位置仅仅大小写不同的尽量多。

分析:用t优先给s中字符找到完全相同的字符匹配,然后再利用大小写不同的字符匹配。

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define esp 1e-14
#define lson   l, m, rt<<1
#define rson   m+1, r, rt<<1|1
#define low(x) ((x)&(-(x)))
#define sz(x) ((int)((x).size()))
#define pf(x) ((x)*(x))
#define pb push_back
#define pi acos(-1.0)
#define in freopen("solve_in.txt", "r", stdin);
#define bug(x) printf("Line : %u >>>>>>\n", (x));
#define TL cerr << "Time elapsed: " << (double)clock() / CLOCKS_PER_SEC * 1000 << " ms" << endl;
#define inf 0x0f0f0f0f
using namespace std;
typedef long long LL;
typedef unsigned US;
typedef pair<int, int> PII;
typedef map<PII, int> MPS;
typedef MPS::iterator IT;

const int maxn = (int)2e5 + 100;
char sa[maxn], sb[maxn];
int cntA[30][2], cntB[30][2];

int main(){
//    in
    int ans1 = 0, ans2 = 0;
    scanf("%s%s", sa, sb);
    int n = strlen(sa);
    int m = strlen(sb);
    for(int i = 0; i < n; i++){
        if(sa[i] >= ‘a‘ && sa[i] <= ‘z‘){
            cntA[sa[i]-‘a‘][0]++;
        }else{
            cntA[sa[i]-‘A‘][1]++;
        }
    }
    for(int i = 0; i < m; i++){
        if(sb[i] >= ‘a‘ && sb[i] <= ‘z‘){
            cntB[sb[i]-‘a‘][0]++;
        }else{
            cntB[sb[i]-‘A‘][1]++;
        }
    }

    for(int i = 0; i < 26; i++){
        int tmp1, tmp2;
       ans1 += (tmp1 = min(cntA[i][0], cntB[i][0])) + (tmp2 = min(cntA[i][1], cntB[i][1]));
       cntA[i][0] -= tmp1;
       cntB[i][0] -= tmp1;
       cntA[i][1] -= tmp2;
       cntB[i][1] -= tmp2;
       ans2 += min(cntA[i][1], cntB[i][0]);
       ans2 += min(cntA[i][0], cntB[i][1]);
    }
    printf("%d %d\n", ans1, ans2);
    return 0;
}

C Anya and Smartphone

题意:n个程序,每个屏幕上最多k个,给定放置顺序,以及依次运行的m个程序,每次运行后位置向前移动一位,

位于第i个屏幕的程序需要i此操作。

分析:直接模拟每次操作,运行后交换一下和之前的程序的位置。

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define esp 1e-14
#define lson   l, m, rt<<1
#define rson   m+1, r, rt<<1|1
#define low(x) ((x)&(-(x)))
#define sz(x) ((int)((x).size()))
#define pf(x) ((x)*(x))
#define pb push_back
#define pi acos(-1.0)
#define in freopen("solve_in.txt", "r", stdin);
#define bug(x) printf("Line : %u >>>>>>\n", (x));
#define TL cerr << "Time elapsed: " << (double)clock() / CLOCKS_PER_SEC * 1000 << " ms" << endl;
#define inf 0x0f0f0f0f
using namespace std;
typedef long long LL;
typedef unsigned US;
typedef pair<int, int> PII;
typedef map<PII, int> MPS;
typedef MPS::iterator IT;

const int maxn = (int)1e5 + 10;
int a[maxn], pos[maxn];

int main(){
//    in
    int n, m, k;
    LL ans = 0;
    cin >> n >> m >> k;
    for(int i = 1; i <= n; i++){
        scanf("%d", a+i);
        pos[a[i]] = i;
    }
    for(int i = 1; i <= m; i++){
        int u;
        scanf("%d", &u);
        ans += pos[u]/k + (pos[u]%k != 0);
        if(pos[u] != 1) {
            swap(a[pos[u]-1], a[pos[u]]);
            int t = pos[u];
            pos[a[t]] = t;
            pos[a[t-1]] = t-1;
        }
    }
    printf("%I64d\n", ans);
    return 0;
}

D Ilya and Escalator

题意:n个人排队依次上电梯,每个人进入或继续等待电梯的概率分别为p,1-p,每秒钟最多只有队首的人进入电梯,

求t秒后在电梯上的人数期望值。

分析:dp[t][m] 表示t秒时有m个人上电梯的概率,转移:dp[t][m] = dp[t-1][m]*(1-p)+dp[t-1][m-1]*p,注意一下边界。

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define esp 1e-14
#define lson   l, m, rt<<1
#define rson   m+1, r, rt<<1|1
#define low(x) ((x)&(-(x)))
#define sz(x) ((int)((x).size()))
#define pf(x) ((x)*(x))
#define pb push_back
#define pi acos(-1.0)
#define in freopen("solve_in.txt", "r", stdin);
#define bug(x) printf("Line : %u >>>>>>\n", (x));
#define TL cerr << "Time elapsed: " << (double)clock() / CLOCKS_PER_SEC * 1000 << " ms" << endl;
#define inf 0x0f0f0f0f
using namespace std;
typedef long long LL;
typedef unsigned US;
typedef pair<int, int> PII;
typedef map<PII, int> MPS;
typedef MPS::iterator IT;
const int maxn = 2000 + 10;
double dp[maxn][maxn];

int main() {
//    in
    int n, m;
    double p;
    scanf("%d%lf%d", &n, &p, &m);
    dp[0][0] = 1.0;
    for(int i = 1; i <= m; i++)
        for(int j = 0; j <= min(i, n); j++) {
            if(j != 0)
                dp[i][j] += dp[i-1][j-1]*p;
            if(j == n)
                dp[i][j] += dp[i-1][j];
            else
                dp[i][j] += dp[i-1][j]*(1-p);
        }
    double ans = 0;
    for(int i = 0; i <= n; i++)
        ans += dp[m][i]*i;
    printf("%.12f\n", ans);
    return 0;
}

E Arthur and Questions

题意:给定数组a[],长度n <= 1e5,以及k,要求满足 (a1  +  a2 ...  +  ak,  a2  +  a3  +  ...  +  ak + 1,  ...,  an - k + 1  +  an - k + 2  +  ...  +  an)构成递增

序列,其中有些ai是未知的,要求满足条件的a[i]序列且|a[i]的和尽量小。

分析:由上面序列递增容易得到:

a1 < ak+1 < a2k+1 < ... < apk+1

a2 < ak+2 < a2k+2 < ... < aqk+1

....

ak < a2K  < a3k     < ...  < ark

每个不等式组独立,以a1 < ak+1 < a2k+1 < ... < apk+1为例,考虑其中两个值确定(不为?)的aik+1及ajk+1,

之间的alk+1的取值未定,那么alk+1取值肯定在aik+1~ajk+1之间,记做[l, r],数的个数必须满足r-l+1>=j-i-1,记num = j-i-1。

分为以下几种情况:

r <= 0 : 将alk+1取r-num+1, r-num+2, ....r即可;

l >= 0 : 将alk+1取l, l+1, l+2,........l+num-1即可;

l <0<r :按照0,±1,±2,±3.....±n等,注意边界范围不足时进行适当处理。

对于仍然为?的a[i]取0即可。

代码:

  1 #include <bits/stdc++.h>
  2 #define pb push_back
  3 #define mp make_pair
  4 #define esp 1e-14
  5 #define lson   l, m, rt<<1
  6 #define rson   m+1, r, rt<<1|1
  7 #define low(x) ((x)&(-(x)))
  8 #define sz(x) ((int)((x).size()))
  9 #define pf(x) ((x)*(x))
 10 #define pb push_back
 11 #define pi acos(-1.0)
 12 #define in freopen("solve_in.txt", "r", stdin);
 13 #define bug(x) printf("Line : %u >>>>>>\n", (x));
 14 #define TL cerr << "Time elapsed: " << (double)clock() / CLOCKS_PER_SEC * 1000 << " ms" << endl;
 15 #define inf 0x0f0f0f0f
 16
 17
 18 using namespace std;
 19 typedef long long LL;
 20 typedef unsigned US;
 21 typedef pair<int, int> PII;
 22 typedef map<PII, int> MPS;
 23 typedef MPS::iterator IT;
 24 const int maxn = (int)1e5 + 10;
 25 const int INF  = (int)2e9;
 26 int a[maxn];
 27
 28 int main() {
 29 //    in
 30     int n, k;
 31     cin >> n >> k;
 32     getchar();
 33     for(int i = 1; i <= n; i++) {
 34         char ch;
 35         while((ch = getchar()) == ‘ ‘);
 36         if(isdigit(ch) || ch == ‘-‘) {
 37             ungetc(ch, stdin);
 38             scanf("%d", a+i);
 39         } else a[i] = INF;
 40     }
 41     a[0] = -(int)1e9 - maxn;
 42     a[n+1] = (int)1e9 + maxn;
 43     int ok = 1;
 44     for(int st = 1; st <= k && ok; st++) {
 45         if(st+k > n) break;
 46         vector<int> index;
 47         index.pb(0);
 48         for(int now = st; now <= n; now += k)
 49             index.pb(now);
 50         index.pb(n+1);
 51         int first = 0, next = 1;
 52
 53         while(next < sz(index) && ok) {
 54             while(a[index[next]] == INF)
 55                 next++;
 56
 57             int l = a[index[first]];
 58             int r = a[index[next]];
 59             if(r-l-1 < next-first-1) {
 60                 ok = 0;
 61                 break;
 62             }
 63             l++, r--;
 64             vector<int> val;
 65             int num = next-first-1;
 66             if(l >= 0) {
 67                 while(num--) {
 68                     val.pb(l+num);
 69                 }
 70             } else if(r <= 0) {
 71                 while(num--) {
 72                     val.pb(r-num);
 73                 }
 74             } else {
 75                 int v = 0;
 76                 for(int p = 0; p < num; p++) {
 77                     int parity = p&1;
 78                     if(p) {
 79                         if(parity) {
 80                             v = -v+1;
 81                             if(v > r) {
 82                                 v = -v;
 83                                 while(p < num) {
 84                                     val.pb(v);
 85                                     v--;
 86                                     p++;
 87                                 }
 88                                 break;
 89                             }
 90                         } else {
 91                             v = -v;
 92                             if(v < l) {
 93                                 v = -v+1;
 94                                 while(p < num) {
 95                                     val.pb(v);
 96                                     v++;
 97                                     p++;
 98                                 }
 99                                 break;
100                             }
101                         }
102                     }
103                     val.pb(v);
104                 }
105             }
106
107             sort(val.begin(), val.end());
108             int cnt = 0;
109
110             while(++first < next) {
111                 a[index[first]] = val[cnt++];
112             }
113             next++;
114         }
115     }
116     if(ok) {
117         for(int i = 1; i <= n; i++)
118             printf("%d%c", a[i] == INF ? 0 : a[i], i == n ? ‘\n‘ : ‘ ‘);
119     } else puts("Incorrect sequence");
120
121     return 0;
122 }

F Pasha and Pipe

代码:

时间: 2024-10-25 18:06:30

Codeforces Round #293 (Div. 2)的相关文章

Codeforces Round #293 (Div. 2) D. Ilya and Escalator (概率DP)

dp[i][j]表示第i秒电梯进去的人数为j时的概率.由于概率比较好求,而且这里的样本是有限个.所以可以先求出概率,然后用公式转化成期望. #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <

Codeforces Round #293 (Div. 2)(A, B, C, D)

A: 模拟26进制加法即可 /************************************************************************* > File Name: cf-293-a.cpp > Author: ALex > Mail: [email protected] > Created Time: 2015年02月25日 星期三 13时40分05秒 *********************************************

Codeforces Round #293 (Div. 2) D. Ilya and Escalator

先求出概率 设 \(f_{i,j}\) 表示第 \(i\) 秒电梯上有 \(j\) 个人的概率 则 \(f_{0,0}=1\) \(f_{i + 1, j + 1} = f_{i, j} \times p\) \(f_{i + 1, j} = f_{i, j} \times (1 - p)\) \(f_{i+1,n}=f_{i,n}\) 答案即为 \(\sum f_{t, i} \times i\) #include <bits/stdc++.h> #define pb push_back #

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除