Codeforces Round #402 (Div. 2)

补的,不过都是自己做的。

A。Pupils Redistribution 【数学】

题意:交换A、B两数组中的元素,使得两组数组含1、2、3、4、5元素的个数相等。

做法:统计A组中1~5的个数,B组中减去。统计正数/2、负数/2绝对值,求两者最大值。数学问题,自己推一下。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include <bits/stdc++.h>

#define  MEM(a,b) memset(a,b,sizeof(a))

using namespace std;

int main(){

    int n, a[110], b[110], sco[10];

    scanf("%d",&n);

    MEM(sco,0);

    for(int i = 0; i < n; i++){

        scanf("%d", a + i);

        sco[a[i]] ++;

    }

    for(int i = 0; i < n; i++){

        scanf("%d", b + i);

        sco[b[i]] --;

    }

    int sum1 = 0, sum2 = 0;;

    for(int i = 1; i <= 5; i++){

        if(sco[i] % 2 != 0){

            puts("-1");

            return 0;

        }

        else if(sco[i] > 0){

            sum1 += sco[i] >> 1;

        }

        else if(sco[i] < 0){

            sum2 -= sco[i] >> 1;

        }

    }

    printf("%d\n", max(sum1,sum2) );

}

B。Weird Rounding 【贪心】

题意:给定N、K两个数,求最少去除N中几个数可使得被10^K整除。

做法:1.当N==0时输出0;

2.如果0够用(K个0)的话,从右往左删除不是0的数;

3.如果0不够用的话,把N删剩下一个0,那么就整除了,也就sum - 1。(题目保证有结果,所以至少有一个0)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#include <bits/stdc++.h>

#define  MEM(a,b) memset(a,b,sizeof(a))

using namespace std;

int main(){

    int n, k;

    cin >> n >> k;

    int ans = 0, sum = 0;

    if(n == 0){

        cout << 0 << endl;

        return 0;

    }

    while(n){

        if(n % 10 == 0) k--;

        else ans++;

        if(k == 0) break;

        n /= 10;

        sum ++;

    }

    if(k == 0) cout << ans << endl;

    else cout << sum - 1 << endl;

}

C。Dishonest Sellers【贪心】

题意:你需要买N个商品,分别给出今天的价格和下一周的价格,你今天必须买K个。求最少花钱方案。

做法:根据A[i]-B[i]的结果sort一下(也就是今天优惠程度越高排越前)。然后从左往右先买K个A,剩下的买A、B中便宜的。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#include <bits/stdc++.h>

using namespace std;

struct Node{

    int a,b;

}node[200010];

bool cmp(const Node &x, const Node &y){

    return x.a - x.b < y.a - y.b;

}

int main(){

    int n, k;

    cin >> n >> k;

    for(int i = 0; i < n; i++) cin >> node[i].a;

    for(int i = 0; i < n; i++) cin >> node[i].b;

    sort(node, node + n, cmp);

    int sum = 0, i;

    for(i = 0; i < k; i++) sum += node[i].a;

    for(i; i < n; i++){

        if(node[i].a < node[i].b) sum += node[i].a;

        else break;

    }

    for(i; i < n; i++) sum += node[i].b;

    cout << sum << endl;

}

D。String Game【二分结果+judge字符串模拟】

题意:妹妹她会按照数组a的元素值a[i],依次删除字符串T第a[i]个元素。哥哥要得到字符串P,求最多让妹妹删除几个字符。

做法:二分结果,求的右界,所以是 mid = (low + high + 1) / 2,bool返回true则low = mid,false则high = mid - 1;

     judge函数 模拟下,O(n)复杂度

BTW,如果求左界,mid = (low + high) / 2,bool返回true则high=mid,false则low=mid+1;


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#include <bits/stdc++.h>

using namespace std;

char a[200020], b[200020];

int num[200020];

int len;

bool judge(int x)

{

    bool vis[200020];

    memset(vis,false,sizeof(vis));

    for(int i = x + 1; i <= len; i++) vis[num[i]] = true;

    int idx = 1;

    for(int i = 1; i <= strlen(b+1); i++)

    {

        while(vis[idx] == false || a[idx] != b[i]){

            idx++;

            if(idx > len){

                return false;

            }

        }

        idx++;

    }

    return true;

}

int main(){

    scanf("%s%s",a+1,b+1);

    len = strlen(a+1);

    for(int i = 1; i <= len; i++) scanf("%d", num + i);

    int low = 0, high = len - 1;

    while(low < high){

        int mid = (low + high + 1) / 2;

        if(judge(mid)) low = mid;

        else high = mid - 1;

    }

    printf("%d\n",low);

}

时间: 2024-12-23 02:38:16

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

Codeforces Round #402 (Div. 2) C. Dishonest Sellers

题目链接:Codeforces Round #402 (Div. 2) C. Dishonest Sellers 题意: 有n个商品,每个商品这一周为ai的价格,下一周为bi的价格. 现在那个人要将这n个商品全部买掉,这一周最少要买k个商品, 为最小的花费是多少. 题解: xjb贪心一下. 按ai-bi排序,为负的要全部买掉,然后如果小于k件,就买前k件. 最后再买下一周的. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i&

Codeforces Round #402 (Div. 2) D. String Game

题目链接:Codeforces Round #402 (Div. 2) D. String Game 题意: 给你两个字符串a,b,然后给你n=strlen(a)个数字n1,n2,...,nn,表示依次删a[ni-1]个字符. 当a串删到有k(k任意)个子串组合起来(顺序不变)刚好等于b串时,就不能删了. 比如 abba->(ab a) 刚好包括 aba ,bba不包括aab. 问最多能删多少次. 题解: 最开始还以为是要用某种数据结构啥的,结果都想复杂了,直接二分答案就行. 然后线性判断删掉后

Codeforces Round #402 (Div. 2) B

Description Polycarp is crazy about round numbers. He especially likes the numbers divisible by 10k. In the given number of n Polycarp wants to remove the least number of digits to get a number that is divisible by 10k. For example, if k?=?3, in the

【DFS】Codeforces Round #402 (Div. 2) B. Weird Rounding

暴搜 #include<cstdio> #include<algorithm> using namespace std; int n,K,Div=1,a[21],m,ans=100; bool vis[21]; void calc(int now) { int t=0; bool flag=0; for(int i=m;i>=1;--i) if(!vis[i]) { if((!flag) && a[i]==0) return; t=t*10+a[i]; fla

Codeforces Round #402 (Div. 2) A

Description In Berland each high school student is characterized by academic performance - integer value between 1 and 5. In high school 0xFF there are two groups of pupils: the group A and the group B. Each group consists of exactly n students. An a

Codeforces Round #402 (Div. 2) C

Description Igor found out discounts in a shop and decided to buy n items. Discounts at the store will last for a week and Igor knows about each item that its price now is ai, and after a week of discounts its price will be bi. Not all of sellers are

Codeforces Round #402 (Div. 2) D

Description Little Nastya has a hobby, she likes to remove some letters from word, to obtain another word. But it turns out to be pretty hard for her, because she is too young. Therefore, her brother Sergey always helps her. Sergey gives Nastya the w

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