Codeforces Round #313 (Div. 2) 解题报告

A. Currency System in Geraldion:

  • 题意:有n中不同面额的纸币,问用这些纸币所不能加和到的值的最小值。
  • 思路:显然假设这些纸币的最小钱为1的话,它就能够组成随意面额。

    假设这些纸币的最小值大于1,那么它所不能组成的最小面额就是1.所以自学求最小值就可以。

  • 我的代码:
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;

int main(void) {
    //problem: , address:
    int n, x, y = INF;
    cin >> n;
    while (n--) {
        cin >> x;
        if (x < y) swap(x, y);
    }
    if(y <= 1) cout << "-1" << endl;
    else cout << "1" << endl;
    return 0;
}

B. Gerald is into Art:

  • 题意:给定三个矩形的 长和款。第一个矩形作为容器。最后两个矩形不可重叠且水平的放置在当中,问能否放下?
  • 思路:这里第一步先把第二个矩形放入容器的左下角显然是最好的策略,能够给第三个矩形最大的可能空间(比赛的时候不够细致,没有注意,第一个大矩形反正左下角必须满足能放下的条件,就没过大数据),注意这里第一个矩形有横放和竖放两种情况。第二步再把第三个矩形放入剩余空间,这时候放置有两种情况:,每种放置情况第三个矩形又分为横放和竖放两种类型。这样就把放置问题分为了8种情况,满足随意情况就可以。
  • 我的代码:
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;

int main(void) {
    int a1, a2, a3, b1, b2, b3;
    cin >> a1 >> b1 >> a2 >> b2 >> a3 >> b3;
    int x = a1 - a2, y = b1 - b2;
    bool ans = false;
    if ( (b2 <= b1 && x >= a3 && b3 <= b1) || (x >= 0 && a3 <= a1 && b3 <= y) || (y >= 0 && x >= b3 && a3 <= b1) || (x >= 0 && b3 <= a1 && a3 <= y) ) ans =true;
    x = a1 - b2;
    y = b1 - a2;
    if ( (y >= 0 && x >= a3 && b3 <= b1) || (x >= 0 && a3 <= a1 && b3 <= y) || (y >= 0 && x >= b3 && a3 <= b1) || (x >= 0 && b3 <= a1 && a3 <= y) ) ans =true;
    if (ans) cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}

C. Gerald’s Hexagon:

  • 题意:用等边三角形堆积成一个六边形,六边形每个内角的为120度。告诉你这个六边形的六条边的长度,问该六边形是由多少个等边三角形组成的。
  • 思路:求出这和整个六边形的面积。再除以三角形的面积,就能够了。

    依据内角都为120度的特点,总是能把六边形切为如图的四个三角形。边上三个三角形面积easy计算。那么依据余弦公式:

    c2=a2+b2?2abcosθ

    能够求出内部三角形的边长。

    再依据海伦公式:

    p=(a+b+c)/2

    s=p(p?a)(p?b)(p?c)?????????????????√

    就可以算出内部三角形面积。

  • 我的代码:
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;
double pi = sqrt(3), eps = 1e-3;

int main(void) {
    double sum = 0, a, b, c, d, e, f;
    cin >> a >> b >> c >> d >> e >> f;
    double x = sqrt((a * a) + (b * b) + a * b);
    double y = sqrt((c * c) + (d * d) + c * d);
    double z = sqrt((e * e) + (f * f) + e * f);
    double s = (x + y + z) / 2;
    //cout << x << " " << y << " "<< z << endl;
    sum += sqrt(s * (s - x) * (s - y) * (s - z));
    //cout << sum << endl;
    sum += 0.25 * pi * (a * b + c * d + e * f);
    cout << int(sum / ( pi / 4) + eps) << endl;
    return 0;
}

D. Equivalent Strings

  • 题意:给定两个字符串同性的法则。推断其是否同性。
  • 递归就可以。但是比赛的代码在大数据的时候超时了。后来加了一个剪枝过了。

    然后超时的主要原因是用了string后,会出现多次复制字符串的情况,把string换为char*,时间缩短10倍!

  • string实现的代码:
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;

bool same(string a, string b) {
    int A[26], B[26];
    memset(A, 0, sizeof(A));
    memset(B, 0, sizeof(B));
    for (int i = 0; i < a.size(); i++) {
        A[a[i] - ‘a‘]++;
        B[b[i] - ‘a‘]++;
    }
    for (int i = 0; i < 26; i++) {
        if (A[i] != B[i]) return false;
    }
    if (a == b) return true;
    if (a.size() % 2 != 0) return false;
    string x1, x2, y1, y2;
    for (int i = 0; i < a.size() / 2; i++) {
        x1 += a[i];
        x2 += b[i];
        y1 += a[i + a.size() / 2];
        y2 += b[i + a.size() / 2];
    }
    return (same(x1, x2) && same(y1, y2)) || (same(x1, y2) && same(y1, x2));
}

int main(void) {
    ios::sync_with_stdio(false);
    string a, b;
    while (cin >> a >> b) {
        if (same(a, b)) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}
  • char* 实现的代码:
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;

bool str (char a[], char b[], int n) {
    bool ans = true;
    for (int i = 0; i < n; i++) {
        if (a[i] != b[i]) {
            ans = false;
            break;
        }
    }
    return !ans;
}

bool same(char a[], char b[], int n) {
    int A[26], B[26];
    memset(A, 0, sizeof(A));
    memset(B, 0, sizeof(B));
    for (int i = 0; i < n; i++) {
        A[a[i] - ‘a‘]++;
        B[b[i] - ‘a‘]++;
    }
    for (int i = 0; i < 26; i++) if (A[i] != B[i]) return false;
    if (!str(a, b, n)) return true;
    if (n % 2 != 0) return false;
    return (same(a, b + n / 2, n / 2) && same(a + n / 2, b, n / 2)) || (same(a, b, n / 2) && same(a + n / 2, b + n / 2, n / 2));
}

int main(void) {
    ios::sync_with_stdio(false);
    char a[200009], b[200009];
    while (cin >> a >> b) {
        int n = strlen(a);
        if (same(a, b, n)) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}
时间: 2024-11-09 00:27:10

Codeforces Round #313 (Div. 2) 解题报告的相关文章

Codeforces Round #259 (Div. 2) 解题报告

终于重上DIV1了.... A:在正方形中输出一个菱形 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月01日 星期五 23时27分55秒 4 5 #include<vector> 6 #include<set> 7 #include<deque> 8 #include<stack> 9 #include<bitset> 10 #inclu

Codeforces Round #262 (Div. 2)解题报告

详见:http://robotcator.logdown.com/posts/221514-codeforces-round-262-div-2 1:A. Vasya and Socks   http://codeforces.com/contest/460/problem/A 有n双袜子,每天穿一双然后扔掉,每隔m天买一双新袜子,问最多少天后没有袜子穿.. 简单思维题:以前不注重这方面的训练,结果做了比较久,这种题自己边模拟边想.不过要多考虑trick ```c++ int main(){ i

Codeforces Round #616 (Div. 2)解题报告

Codeforces Round #616 (Div. 2)解题报告 A. Even But Not Even 找两个奇数就行了. #include<bits/stdc++.h> using namespace std; void solve() { int n; string s; cin >> n >> s; string ans = ""; for(int i = 0; i < n; i++) { if(int(s[i] - '0')%2

Codeforces Round #479 (Div. 3)解题报告

题目链接: http://codeforces.com/contest/977 A. Wrong Subtraction 题意 给定一个数x,求n次操作输出.操作规则:10的倍数则除10,否则减1 直接写,手速题,没啥好说的 B. Two-gram 题意 求出现次数最多的连续两个字符 还是签到题,我居然很麻烦地用了map,= =算了,思路畅通都无所谓了 #include <iostream> #include<stdio.h> #include<algorithm> #

Codeforces Round #515 (Div. 3) 解题报告(A~E)

题目链接:http://codeforces.com/contest/1066 A题: 题意:Vova想坐火车从1点到L点,在路上v的整数倍的点上分布着灯笼,而在路上从l到r处停着别的火车,它挡着Vova的视线使他看不到灯笼.给定L,v,l,r求Vova能看到的灯笼数. 分析:从1到x上所有的灯笼数量为x/v个.则路上所有的灯笼数为L/v个,被挡住的则为 r/v - (l-1)/v 个,相减即为答案. #include<iostream> #include<cstdio> #inc

Codeforces Round #401 (Div. 2)解题报告

A - Shell Game 1 #include <iostream> 2 #include<bits/stdc++.h> 3 #include <stack> 4 #include <queue> 5 #include <map> 6 #include <set> 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10

Codeforces Round #390 (Div. 2) 解题报告

时隔一个月重返coding…… 期末复习了一个月也不亏 倒是都过了…… 就是计组61有点亏 复变68也太低了 其他都还好…… 假期做的第一场cf 三道题 还可以…… 最后room第三 standing383简直人生巅峰…… 看楼上楼下都是两道题的 如果A题不错那么多估计能进前300了吧…… 这场倒是把之前两场的分加回来了 开头不错 这个假期争取紫名~ A.Lesha and array splitting 把给定的数组分割成几个区间 要求各个区间和不能为0 一开始没注意到分割之后的区间重新合成之

Codeforces Round #394 (Div. 2) 解题报告

开始补题,今天下午virtual参赛,过了ABC,D题因为一点小错误而没能在比赛时间中AC,时间到了之后几分钟就发现了问题所在,略有遗憾.之后一直冥思苦想E题,在提示下终于明白,真的是给这样组合题画风的题目跪了,只能说继续加油,扩展思路吧. A题 题目地址 只有奇偶数个数相差小于等于1时可以,需要特判不能使二者均为0的情况. 参考代码 1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 #include <iostream>

Codeforces Round #279 (Div. 2) 解题报告

A - Team Olympiad 贪心水题..都从第一个开始取即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map