Codeforces Round #536 (Div. 2)

Posted kanoon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #536 (Div. 2)相关的知识,希望对你有一定的参考价值。

Codeforces Round #536 (Div. 2)

A. Lunar New Year and Cross Counting

模拟,可以外加两行两列防止越界。

技术图片
#include <bits/stdc++.h>
using namespace std;
int dir[4][2]={{-1,-1},{-1,1},{1,-1},{1,1}};
int main()
{
    int n;cin>>n;
    char MP[n+2][n+2]={0};
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>MP[i][j];
    int cnt=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(MP[i][j]==X){
                bool flag=true;
                for(int k=0;k<4;k++){
                    int x=i+dir[k][0];
                    int y=j+dir[k][1];
                    if(MP[x][y]!=X) flag=false;
                }
                if(flag) ++cnt;
            }
    cout<<cnt<<"
";
    return 0;
}
View Code

B. Lunar New Year and Food Ordering

模拟,构造结构体按题意排序,将排序后下标与原下标建立映射,另需记录已售完的最小下标避免重复遍历导致超时。

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct DISH{
    int a,c,num;
};
int main()
{
    int n,m;cin>>n>>m;
    DISH dish[n];
    for(int i=0;i<n;i++) cin>>dish[i].a;
    for(int i=0;i<n;i++) cin>>dish[i].c;
    for(int i=0;i<n;i++) dish[i].num=i+1;
    sort(dish,dish+n,[&](DISH a,DISH b){
        return a.c==b.c?a.num<b.num:a.c<b.c;
    });
    map<int,int> _map;
    for(int i=0;i<n;i++) _map[dish[i].num]=i;
    int zero=0;
    for(int _=0;_<m;_++){
        int t,d;cin>>t>>d;
        int i=_map[t];
        long long cost=0;
        if(dish[i].a>=d){
            cost+=1LL*d*dish[i].c;
            dish[i].a-=d;
            d=0;
        }else{
            cost+=1LL*dish[i].a*dish[i].c;
            d-=dish[i].a;
            dish[i].a=0;
            for(int i=zero;i<n&&d>0;i++){
                int mi=min(d,dish[i].a);
                cost+=1LL*mi*dish[i].c;
                d-=mi;
                dish[i].a-=mi;
                if(dish[i].a==0) zero=i+1;
            }
        }
        cout<<(d>0?0:cost)<<"
";
    }
    return 0;
}
View Code

C. Lunar New Year and Number Division

贪心,模拟,双指针。

技术图片
#include <bits/stdc++.h>
using namespace std;
long long sqr(int a[],int i,int j){
    return 1LL*(a[i]+a[j])*(a[i]+a[j]);
}
int main()
{
    int n;cin>>n;
    int a[n];for(int &i:a) cin>>i;
    sort(a,a+n);
    int i=0,j=n-1;
    long long sum=0;
    while(i<j){
        sum+=sqr(a,i,j);
        ++i,--j;
    }
    if(i==j) sum+=1LL*a[i]*a[i];
    cout<<sum<<"
";
    return 0;
}
View Code

D. Lunar New Year and a Wander

注意每个点可以重复经过,所以可以用优先队列BFS,手动线性模拟是因为不是二分插入很容易超时。

技术图片
#include <bits/stdc++.h>
using namespace std;
const int M=1e6;
vector<vector<int>> e;
bool vis[M];
priority_queue<int,vector<int>,greater<int>> q;//前小后大
int main()
{
    int n,m;cin>>n>>m;
    e.resize(n+1);
    for(int i=0;i<m;i++){
        int u,v;cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    q.push(1);
    vis[1]=true;
    while(!q.empty()){
        int u=q.top();
        q.pop();
        cout<<u<< ;
        for(int v:e[u]){
            if(!vis[v]){
                q.push(v);
                vis[v]=true;
            }
        }
    }
    return 0;
}
View Code

 

以上是关于Codeforces Round #536 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #536 (Div. 2)

Codeforces Round #536 (Div. 2)

Codeforces Round #536 (Div. 2) E dp + set

Codeforces Round #536 (Div. 2) - D. Lunar New Year and a Wander(最短路)

codeforces 536a//Tavas and Karafs// Codeforces Round #299(Div. 1)

Codeforces Round #536 (Div. 2) B. Lunar New Year and Food Ordering