AtCoder Beginner Contest 137(A-D)

ABC签到,细讲CD题。

A:

意外的是发现了max的新用法,可以的。

#include 
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int MAXN = 1e5 + 7;

int main()
{
    ios::sync_with_stdio(0);
    int a, b;
    cin>>a>>b;
    cout<

B:

#include 
using namespace std;
#define ll long long
const int MAXN = 300 + 7;

int main()
{
    int k, x;
    cin>>k>>x;
    for(int i = x-k+1; i<= x+k-1;i++)
    {
        cout<

C:

就是对每个字符串排序,然后再把所有字符串排序,两两相等就加1。这里我用的是vector套string。也可以用无序map,时间都差不多。

#include 
using namespace std;
#define ll long long
const int MAXN = 1e5 + 7;

vector  ve;
int main()
{
    ios::sync_with_stdio(0);
    int n;
    cin>>n;
    string s;
    ll ans = 0;
    for(int i = 0; i < n; i++)
    {
        cin>>s;
        sort(s.begin(), s.end());
        ve.push_back(s);
    }
    sort(ve.begin(),ve.end());
    int x = 1;
    for(int i = 1; i < n; i++)
    {
        if(ve[i] == ve[i-1])
        {
            ans += x;
            x++;
        }
        else x = 1;
    }
    cout<

下面是大佬写的无序map:

#include 
using namespace std;
#define ll long long
const int MAXN = 1e5 + 7;

int main()
{
    ios::sync_with_stdio(0);
    int n;
    cin >> n;
    unordered_map mp;
    ll ans = 0;
    for(int i = 0; i < n; i++) 
    {
        string s;
        cin >> s;
        sort(s.begin(), s.end());
        ans += mp[s];
        mp[s]++;
    }
    cout << ans << endl;
    return 0;
}

D:

说实话,当我知道这道题用优先队列的时候,我发现这也是一道签到了。比赛的时候一直在用贪心写,可能我太贪了。然后怎么贪都写不对,放弃了。最后的时候大佬说用优先队列存,一下就豁然了,可惜没有时间了。

然后周天说来补题的,结果上午睡大觉+下午睡大觉+晚上烧烤。。。

好吧今天周一了,我补!写了半天一直wa,都没信心了,是这个思想啊怎么就不对了。去看了看大佬的代码,好吧,直接遍历m多方便,我硬是写单循环给累死,不说了。

#include 
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int MAXN = 1e5 + 7;

struct node
{
    int x, y;
}stu[MAXN];

bool cmp(node a, node b)
{
    return a.x < b.x;
}
priority_queue  que;

int main()
{
    ios::sync_with_stdio(false);
    int n, m;
    cin>>n>>m;
    ll ans = 0;
    for(int i = 0; i < n; i++)
    {
        cin>>stu[i].x>>stu[i].y;
    }
    sort(stu, stu+n, cmp);
    int pos = 0;
    for(int i = 1; i <= m; i++)
    {
        for(int j = pos; j < n; j++)
        {
            if(stu[j].x == i) que.push(stu[j].y);
            else
            {
                pos = j;
                break;
            }
        }
        if(que.size())
        {
            ans += que.top();
            que.pop();
        }
    }
    cout<

 

你可能感兴趣的:(AtCoder)