当前位置 : 主页 > 网页制作 > css >

Codeforces Round #546 (Div. 2)

来源:互联网 收集:自由互联 发布时间:2021-06-13
A. Nastya Is Reading a Book(水) 遍历一下,找到k所在的章数,总的减去已经读的…… #include bits/stdc++.h using namespace std; const int maxn=1e5+ 10 ; struct node{ int a,b;}Q[maxn]; int main(){ int n; cin n; for (

A. Nastya Is Reading a Book(水)

遍历一下,找到k所在的章数,总的减去已经读的……

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
    int a,b;
}Q[maxn];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>Q[i].a>>Q[i].b;
    }
    int k;
    cin>>k;
    int ans=0;
    for(int i=1;i<=n;i++){
        if(Q[i].a<=k&&Q[i].b>=k){
            ans=i;
            break;
        }
    }
    cout<<n-ans+1<<endl;
 
    return 0;
}
View Code

B. Nastya Is Playing Computer Games

贪心,先走到(最左,或者最右)端点,比较走到哪个端点比较小,然后再考虑扔和捡,(比如现在走到最左边)第一次肯定要扔到有一块石头的(假设扔到第二个位置),然后把第二个位置的石头都扔到第一个位置,然后把所有的石头都扔到已经走过的地方;

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
 
int main(){
    int n,k;
    cin>>n>>k;
    if(n==1){
        cout<<"2"<<endl;
        return 0;
    }
    else if(n==2){
        cout<<"6"<<endl;
        return 0;
    }
    int ans=min(k-1,n-k);
    ans+=6;
    n-=2;
    for(int i=1;i<=n;i++)ans+=3;
    cout<<ans<<endl;
 
 
 
    return 0;
}
View Code

C. Nastya Is Transposing Matrices

题意:给你两个矩阵,问你是否可以根据每个子矩阵的主对角线置换来得到相同的矩阵;

me:想到了每个子矩阵的主对角线应该相同,但是不会处理……

look other:类似桶排序,用map来离散化存值;

#include <bits/stdc++.h>
using namespace std;
const int maxn=550;
int n,m;
int a[maxn][maxn],b[maxn][maxn];
map<int,int>mp[1010];
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            mp[i+j][a[i][j]]++;
        }
    }
    int flag=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>b[i][j];
            if(mp[i+j][b[i][j]]<=0){
                flag=0;
            }
            else mp[i+j][b[i][j]]--;
        }
    }
    if(flag)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
 
    return 0;
}
View Code

D. Nastya Is Buying Lunch

题意:有一个队列,你现在在最后一个,每个人都有一个数,当u,v相邻时可以交换u,v,问你最多能前进几个位置;

当时看错了,以为不相邻也可以交换,导致样例都没理解清楚,就结束了;

解:贪心,从后面一直往前更新,当这两个数满足相邻的时候就可以换;

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int n,m,a[maxn],b[maxn];
vector<int>g[maxn];
bool cmp(int u,int v){
    return b[u]<b[v];
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[a[i]]=i;
    }
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        g[u].push_back(v);
    }
    for(int i=n;i>0;i--){
        int u=a[i];
        sort(g[u].begin(),g[u].end(),cmp);
        for(auto it:g[u]){
            if(b[it]==b[u]+1){
                b[u]++;
                b[it]--;
            }
        }
    }
    cout<<n-b[a[n]]<<endl;
 
    return 0;
}
View Code
网友评论