Codeforces Round #297 (Div. 2)

A题

题目大意:

给你一个字符串,奇数的时候是钥匙,偶数的时候是门,一把钥匙只能开对应的门,然后问你最少额外需要多少把钥匙。

分析:

用的数组记录一下就行,(注意的是先开门,再拿钥匙!开始错在这里了,决心好好学英语)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<string>
using namespace std;
int main()
{
    int n,vist[10000];
    char a[400010];
    scanf("%d",&n);
    scanf("%s",a);
    memset(vist,0,sizeof(vist));
    vist[a[0]-‘a‘]=1;
    int sum=0;
    int i;
    for( i=1;i<2*n-2;i=i+2)
    {
        if(vist[a[i]-‘A‘]==0)
        {
            sum++;
        }
        else
        {
            vist[a[i]-‘A‘]--;
        }
        vist[a[i+1]-‘a‘]++;
    }
    printf("%d\n",sum);
    return 0;
}

B题

题目大意

一个字符串str ,从1 开始长度为s,每次给你一个 a[i]  ,然后将  [ a[i] , (s-a[i]+1) ]  翻转,问你经过n次操作以后整个字符串是什么样的。

分析

需要从内到外,看那些区域需要翻转,那些区域不需要就行了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<string>
#define  maxn 410004
using namespace std;
int vist[maxn],zhuan[maxn];

int main()
{
    char a[200005];
    int n,num;
    scanf("%s",a);
    int len=strlen(a);
    memset(vist,0,sizeof(vist));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&num);
        vist[--num]++;

    }
    int sum=0;
    for(int i=0;i<len/2;i++)
    {
        sum+=vist[i];
        if(sum%2)
          swap(a[i],a[len-i-1]);
    }
    printf("%s\n",a);
    return 0;
}

C题

题目大意

给出n条线段的长度,任意一条长度为len的线段可以当作len或len-1的线段使用,求能构成的矩形的最大的总面积(可以是多个矩形的和)。

分析

要是总面积最大,就要贪心,使长度最大的对子和长度次最大的对子组合,可以是多个矩形的和。
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define INF 10000000
 7 using namespace std;
 8 int main()
 9 {
10     int n;
11     long long a[200010];
12     scanf("%d",&n);
13     for(int i=1;i<=n;i++)
14         scanf("%I64d",&a[i]);
15     sort(a+1,a+1+n);
16     long long flag=0;
17     long long ans =0;
18     for(int i=n;i>1;)
19     {
20         if(a[i]==a[i-1]||a[i]-1==a[i-1])
21         {
22             if(flag)
23             {
24                 ans+=flag*a[i-1];
25                 flag=0;
26             }
27             else
28                flag=a[i-1];
29             i=i-2;
30         }
31         else
32             i--;
33     }
34
35     printf("%I64d\n",ans);
36     return 0;
37 }

D题

题目大意

给你一个n*m的格子,‘.‘代表空地,‘*‘代表墙,你使墙变为空地,问你最小的次数使每个空地块为矩形。

分析

每当搜索到有3个‘.‘的就让那个余下的变为空地,再次在它的四周8格以每4格搜索,直到都符合。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <queue>
 5 #include <cassert>
 6 using namespace std;
 7
 8 char a[2005][2005];
 9 int n, m;
10
11 bool check(int x, int y)
12 {
13     if(a[x][y] == ‘.‘ || x < 1 || y < 1 || x > n || y > m) return 0;
14
15     if(a[x][y - 1] == ‘.‘ && a[x - 1][y - 1] == ‘.‘ && a[x - 1][y] == ‘.‘) return 1;
16     if(a[x][y + 1] == ‘.‘ && a[x - 1][y + 1] == ‘.‘ && a[x - 1][y] == ‘.‘) return 1;
17     if(a[x][y - 1] == ‘.‘ && a[x + 1][y - 1] == ‘.‘ && a[x + 1][y] == ‘.‘) return 1;
18     if(a[x][y + 1] == ‘.‘ && a[x + 1][y + 1] == ‘.‘ && a[x + 1][y] == ‘.‘) return 1;
19
20     return 0;
21 }
22 int x[8]= {-1,-1,0,1,1,1,0,-1};
23 int y[8]= {0,1,1,1,0,-1,-1,-1};
24 int main()
25 {
26     scanf("%d %d", &n, &m);
27     for(int i = 1; i <= n; i++)
28     {
29         scanf("%s", a[i] + 1);
30     }
31
32     queue<pair<int , int> > q;
33     for(int i = 1; i <= n; i++)
34     {
35         for(int j = 1; j <= m; j++)
36         {
37             if(check(i, j))
38                 q.push(make_pair(i, j));
39         }
40     }
41
42     while(!q.empty())
43     {
44         int i = q.front().first;
45         int j = q.front().second;
46         q.pop();
47         if(!check(i, j)) continue;
48         a[i][j] = ‘.‘;
49         for(int ii=0; ii<8; ii++)
50         {
51             if( check(i + x[ii], j + y[ii]))
52             {
53                 q.push(make_pair(i + x[ii], j + y[ii]));
54             }
55         }
56     }
57
58         for(int i = 1; i <= n; i++)
59         {
60             printf("%s\n", a[i] + 1);
61         }
62
63     return 0;
64 }
时间: 2024-10-29 04:22:27

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

BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls

题目传送门 1 /* 2 题意:问最少替换'*'为'.',使得'.'连通的都是矩形 3 BFS:搜索想法很奇妙,先把'.'的入队,然后对于每个'.'八个方向寻找 4 在2*2的方格里,若只有一个是'*',那么它一定要被替换掉 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9 #include <cstring> 10 #include <queue> 1

贪心 Codeforces Round #297 (Div. 2) C. Ilya and Sticks

题目传送门 1 /* 2 题意:给n个棍子,组成的矩形面积和最大,每根棍子可以-1 3 贪心:排序后,相邻的进行比较,若可以读入x[p++],然后两两相乘相加就可以了 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 typedef long long ll; 12 13 co

模拟 Codeforces Round #297 (Div. 2) A. Vitaliy and Pie

题目传送门 1 /* 2 模拟:这就是一道模拟水题,看到标签是贪心,还以为错了呢 3 题目倒是很长:) 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <iostream> 8 #include <algorithm> 9 #include <cstring> 10 using namespace std; 11 12 const int MAXN = 2e5 + 10; 13

Codeforces Round #297 (Div. 2)E. Anya and Cubes

题目链接:http://codeforces.com/problemset/problem/525/E 题意: 给定n个数,k个感叹号,常数S 下面给出这n个数. 目标: 任意给其中一些数变成阶乘,至多变k个. 再任意取一些数,使得这些数和恰好为S 问有多少方法. 思路: 三进制状压,0代表不取,1代表取阶乘,2代表直接取: 中途查找,节约空间: 代码如下: #include<cstdio> #include<cstring> #include<iostream> #i

Codeforces Round #297 (Div. 2) (ABCDE题解)

比赛链接:http://codeforces.com/contest/525 算是比较简单的一场了,拖了好久现在才补 A. Vitaliy and Pie time limit per test:2 seconds memory limit per test:256 megabytes After a hard day Vitaly got very hungry and he wants to eat his favorite potato pie. But it's not that sim

Codeforces Round #297 (Div. 2) E题. Anya and Cubes (中途相遇法)

题目地址:Anya and Cubes 比赛的时候居然没想起中途相遇法...这题也是属于想起来就很简单系列. 中途相遇法也叫折半搜索.就是处理前一半,把结果储存起来,再处理后一半,然后匹配前一半存储的结果. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib

Codeforces Round #297 (Div. 2) 题解

A题: 有n个房间排成一条线,每个房间之间都有一个通道通往下个房间,则共有n-1个通道,现在你要从1到n,而且每个房间还放有一个钥匙,如果要开这个通道,通道的钥匙你有,则通过,否则你要买相应的钥匙. 大写代表这个通道,小写代表相应的钥匙. 问你最少需要买多少把钥匙. 样例: input 3aAbB output 0 input 4aBaCaB output 3 input 5xYyXzZaZ output 2 看样例应该就知道他要问什么了吧. 思路:直接扫一遍过去,看缺多少则买多少. 1 #in

CodeForces Round #297 Div.2 E (中途相遇法)

当时打比赛的时候卡在D题了,没有看E.现在看来E还是不难的. 将n个数排序后,其实不排序也是可以的,只是排序能快一半的时间. 枚举前一半能得到多少种和,放到map里面: 然后在后一半数中枚举,然后在map里面查找. 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 5 const int maxn = 30; 6 LL a[maxn], f[maxn], S, ans; 7 int n, m,

Codeforces Round #297 (Div. 2)B Pasha and String

B. Pasha and String time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Pasha got a very beautiful string s for his birthday, the string consists of lowercase Latin letters. The letters in the