AtCoder Beginner Contest 159

比赛链接:https://atcoder.jp/contests/abc159/tasks

A - The Number of Even Pairs

题意

已知奇偶数的个数,求和为偶数的数对个数。

代码

#include <bits/stdc++.h>
using namespace std; 
long long Cn_2(int i){
    return 1LL * i * (i - 1) / 2; 
}
int main()
{
    int n, m; cin >> n >> m; 
    cout << Cn_2(n) + Cn_2(m); 
    return 0;
}

B - String Palindrome

题意

判断一个字符串和以中心为分界点的两个子串是否回文。

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s, r_s; 
    cin >> s; 
    r_s = s; 
    reverse(r_s.begin(), r_s.end()); 
    if(s == r_s){
        s = s.substr(0, s.size() / 2); 
        r_s = s; 
        reverse(r_s.begin(), r_s.end()); 
        if(s == r_s) return 0 * puts("Yes"); 
    }
    return 0 * puts("No"); 
}

C - Maximum Volume

题意

已知长方体三边和,求最大体积。

思路

$L=a+b+c\ge3\sqrt[3]{abc}$ 

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    double a, b, c, tot_len; 
    cin >> tot_len; 
    a = b = c = tot_len / 3.0; 
    printf("%.12f", a * b * c); 
    return 0;
}

D - Banned K

题意

有一数列,问每个数外两两相同的数有多少对。

思路

求出所有值两两相同的总对数,每个数的值再重新计算。

代码

#include <bits/stdc++.h>
using namespace std; 
long long Cn_2(int i){
    return 1LL * i * (i - 1) / 2; 
}
int main()
{
    map<int, int> m; 
    int n; cin >> n; 
    int a[n]; for(int & i : a) cin >> i, ++ m[i]; 
    
    long long sum = 0; 
    for(auto i : m) sum += Cn_2(i.second); 

    for(int i : a)    
        cout << sum - Cn_2(m[i]) + Cn_2(m[i] - 1) << "\n"; 

    return 0; 
}

E - Dividing Chocolate

题意

有一 $H{\times}K$ 的黑白矩阵,问使得分割后每块白色不多于 K 个的最少切割次数。

思路

$H$ 不大于 $10$,可以枚举每行的选举情况,然后利用二维前缀和计算白色的个数贪心切割矩阵的列。(待填)

代码

待填

F - Knapsack for All Segments

题意

求一数列所有的连续区间中和为 $S$ 的子区间个数和。(如数列 $2\ 2\ 4$,$S=4$,有$[1,2]=1$,$[1,3]=2$,$[2,3]=1$,$[3,3]=1$, 共 $5$ 个)。

思路

可以非常巧妙地化为 01 背包求解,详见博主 st1vdy 的做法。

代码

待填

 

posted @ 2020-04-07 21:05  Kanoon  阅读(139)  评论(0)    收藏  举报