当前位置:编程学习 > C/C++ >>

Codeforces Round #208 (Div. 2)

A. Dima and Continuous Line
 
描述:给一个n [1, 10^3], 然后是n个点横坐标xi [-10^6, 10^6],每相邻的两个点是一个半圆直径的两个点。判断这些圆会不会相交。相交输出yes,否则输出no。
思路:数据规模很小,直接暴力15ms水过。
[cpp]  
#include <iostream>  
#include <cstdio>  
#include <algorithm>  
using namespace std;  
struct Circus {  
    int left, right;  
    bool operator< (const Circus &next) const  
    {  
        return (left < next.left) || (left == next.left && right < next.right);  
    }  
};  
bool IsInsect(const Circus &a, const Circus &b)  
{  
    return (a.left < b.left) && (b.left < a.right) && (a.right < b.right);  
}  
int main()  
{  
    int n;  
    while (scanf("%d", &n) != EOF)  
    {  
        int a[n];  
        for (int i = 0; i < n; ++i)  
            scanf("%d", &a[i]);  
        if (n == 1)  
        {  
            cout << "no" << endl;  
            continue;  
        }  
        Circus cir[n];  
        for (int i = 0; i < n - 1; ++i)  
        {  
            cir[i].left = min(a[i], a[i+1]);  
            cir[i].right = max(a[i], a[i+1]);  
        }  
        sort(cir, cir + n);  
        bool flag = 0;  
        for (int i = 0; i < n; ++i)  
            for (int j = i + 1; j < n; ++j)  
                if (IsInsect(cir[i], cir[j]))  
                {  
                    flag = 1;  
                    break;  
                }  
        if (flag)  
            cout << "yes\n";  
        else  
            cout << "no\n";  
    }  
    return 0;  
}  
 
 
B. Dima and Text Messages
 
描述:第一行是一个n [1, 10^5], 然后是n个字符串,首先按照规则在每个相邻字符串之间加上<3,(首位也要加上),得到<3word1<3word2<3 ... wordn<3。然后在得到的字符串上任意位置添加任意个小写字母或数字或大于小于号。现在输入一个字符串text,判断此字符串是否是按照规则构成的。是则输出yes,or no。
思路:先按照规则生成<3word1<3word2<3 ... wordn<3这个字符串。然后进行离散的匹配。只要它的每个字符都在text中出现就yes。
[cpp]  
#include <iostream>  
#include <cstdio>  
#include <string>  
#include <algorithm>  
using namespace std;  
inline bool IsLegal(char c)  
{  
    return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '<' || c == '>');  
}  
int main()  
{  
    int n;  
    scanf("%d", &n);  
    string s("<3"), t, text;  
    while (n--)  
    {  
        cin >> t;  
        s += t;  
        s += "<3";  
    }  
    cin >> text;  
    int lens = s.size(), lentxt = text.size();  
    if (lentxt < lens)                           //text长度小于s时一定不行  
    {  
        printf("no\n");  
        return 0;  
    }  
    for (int i = 0; i < lentxt; ++i)         //判断每个字符是否合法  
        if (!IsLegal(text[i]))  
        {  
            printf("no\n");  
            return 0;  
        }  
    int i = 0, j = 0;                       //i,j分别作为s和text下标  
    while (true)  
    {  
        if (j >= lentxt)  
            break;  
        while (text[j] != s[i] && j < lentxt)  //直到找到s[i]==text[j],一个匹配  
            ++j;  
        ++i, ++j;                       //找到一个匹配后就同时递增找下一个  
    }  
                                        //最后i小于s的长度时,说明没有匹配完全s中的每一个,输出no  
    if (i >= lens)                       //有可能出现前面都匹配,这时候i大于lens,一开始用==wa了一次  
        printf("yes\n");  
    else  
        printf("no\n");  
    return 0;  
}  
 
C. Dima and Containers
 
描述:操作三个数据结构使得每次取出的结果最大。具体请看题目。
思路:我把最大的三个记录,剩下的就直接放到deck的队尾。这一题自己思路不是很好,虽然过了,但是代码写的很烂。
[cpp]  
#include <iostream>  
#include <cstdio>  
#include <algorithm>  
#include <vector>  
#include <queue>  
#include <stack>  
#include <deque>  
#include <string>  
using namespace std;  
struct T {  
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,