Educational Codeforces Round 131 (Rated for Div. 2)【比赛记录】

A-Grass Field

简单思维题!!!

答案为0的情况:四个数全为0

答案为1的情况:存在1的同时存在0

答案为2的情况:四个数全为1

#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
int a[10][10];
int main(){
    int t;sc(t);
    while(t--){
        bool flag=false,word=false;
        for(int i=1;i<=2;i++){
            for(int j=1;j<=2;j++){
                sc(a[i][j]);
                if(a[i][j]==1) flag=true;
                else word=true;
            }
        }
        if(!flag) printf("0\n");
        else if(flag&&!word) printf("2\n");
        else printf("1\n");
    }
}

B-Permutation

简单思维,倍数为2一直往右填即可

#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
bool vis[Max];
int main(){
    int t;sc(t);
    while(t--){
        int n;sc(n);
        for(int i=1;i<=n;i++) vis[i]=false;
        printf("2\n");
        for(int i=1;i<=n;i++){
            if(vis[i]) continue;
            // vis[i]=true;
            int num=i;
            while(num<=n&&!vis[num]){
                vis[num]=true;
                printf("%d ",num);
                num*=2;
            }
        }
        printf("\n");
    }
}

C-Schedule Management

二分,先预处理每个工人能一个小时完成的任务数,然后二分答案,check O(n)判断即可!!!

切记,check不要爆int,开ll

#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
int a[Max];
int h[Max];
int sum[Max];
int n;
bool check(int x){
    ll ans=0;
    for(int i=1;i<=n;i++){
        if(h[i]>=x) ans+=(h[i]-x);
    }
    for(int i=1;i<=n;i++){
        if(h[i]<=x){
            ans-=(x-h[i])/2;
        }
    }
    if(ans<=0) return true;
    return false;
}
int main(){
    int t;sc(t);
    while(t--){
        sc(n);
        for(int i=1;i<=n;i++) h[i]=0;
        int m;sc(m);
        for(int i=1;i<=m;i++){
            sc(a[i]);h[a[i]]++;
        }
        sort(h+1,h+1+n);
        // for(int i=1;i<=n;i++) sum[h[i]]++;
        int l=h[1],r=h[n];
        while(l<=r){
            int mid=(l+r)/2;
            if(check(mid)) r=mid-1;
            else l=mid+1;
        }
        printf("%d\n",l);
    }
}

D-Permutation Restoration

贪心!!!

先计算出每个位置可填数字的范围,然后肯定是选取最左边的区间,然后在可达右区间最小的位置先进行放置,这样子才可以让后面的位置有尽可能多的位置1选择,可以用优先队列存下每个区间,然后用一个集合来维护当前合法的位置即可。

#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=1e9+7;
struct node{
    int r;
    int value;
    friend bool operator<(node a,node b){
        return a.r>b.r;
    }
};
priority_queue<node>mp[Max];
bool vis[Max];
int a[Max];
int main(){
    int t;sc(t);
    while(t--){
        int n;sc(n);
        for(int i=1;i<=n;i++) vis[i]=false;
        for(int i=1;i<=n;i++){
            int k;sc(k);
            int L,R;
            if(k==0) L=i+1,R=n;
            else{
                R=i/k;
                L=i/(k+1)+1;
            }
            mp[L].push({R,i});
        }
        priority_queue<node>s;
        for(int i=1;i<=n;i++){

            while(!mp[i].empty()){
                s.push(mp[i].top());
                mp[i].pop();
            }
            node temp=s.top();
            a[temp.value]=i;
            s.pop();
        }
        for(int i=1;i<=n;i++) printf("%d ",a[i]);
        printf("\n");
    }
}

本次比赛,打崩了,C没有立马想到二分,在写的过程中也没有发现自己爆了int,以后这样成为一个思维习惯,开int的同时想会不会爆int,避免不必要的罚时!!!D题还需要练,思维太慢,有时甚至想不出来!!!菜死了T-T

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瘾ิۣۖิۣۖิۣۖิꦿ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值