CodeForces1249总结

传送门~
A. Yet Another Dividing into Teams
题目大意:共n名学生,每名学生有不同的编程能力,现将他们分组,不允许同一队两个学生的编程能力之差的绝对值等于1,问最少需要分成多少队。
水题,所有学生编程能力均不同,所以答案非1即2,判断给出数组中有无相邻数字即可。
B. Books Exchange
题目大意:共n个孩子,每人在这一天结束时把自己的书传递给一个特定的学生,现给出每个孩子所要传递给的特定的人所组成的特定序列,打印出n个数,分别代表该孩子的书第几天返回到他手里。
简单版n较小,直接暴力循环就可以,困难版n较大,暴力循环肯定超时,这时候可以用队列,不断去进入队列,直到形成自环的时候结束,然后开数组存队列大小即中间转换的次数即可。
C1. Good Numbers
题目大意:给你一个整数n,若正整数可以表示为3的不同幂之和(即不允许3的幂次重复),则成为good,判断给出的数是否为good
简单版n较小,先转化为三进制,再通过循环,用数组存储得到的数,再将三进制数转化为十进制输出即可,不过我第一遍没ac,主要是转三进制的时候出问题了,忽略了转之前就比三小的情况,加上这种情况就可以ac了
复杂版n的范围到了10^18,再用暴力转换一定会超时,大佬的思路是我们可以将问题抽象成3进制,然后二分答案,寻找到最小的好数即可
参考大佬代码

#include<bits/stdc++.h>
#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<long,long> PLL;
typedef pair<char,char> PCC;
typedef long long LL;
const int N=40;
const int M=150;
const int INF=0x3f3f3f3f;
const int MOD=998244353;
LL n,a[N];
LL get(LL x){
    LL res=0;
    for(int i=0;i<=39;i++){
        if((x>>i)&1) res+=a[i];
    }
    return res;
}
bool check(LL x){
    if(get(x)>=n) return true;
    return false;
}
void solve(){
    cin>>n;
    LL l=1,r=(1ll<<39)-1;
    while(l<r){
        LL mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<get(l)<<endl;
}
int main(){
    IOS;
    a[0]=1;
    for(int i=1;i<=39;i++) a[i]=a[i-1]*3;
    int t;cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

D.Too Many Segments
题目大意:给出多组线段的首尾,而每一个点的覆盖次数不超过K,每次可去除一个线段,问最少去除多少线段以及线段的首尾位置。
官方题解是用了贪心,找到被覆盖超过k次的线段的最左边的点,通过找到一些尚未被删除且覆盖了这一点的段,并且它的最右边是最大可能的,并删除这个段来解决此问题。复杂度可以为O(n3)。说实话这个题解我没怎么看懂,不过大致是若超过k次则去掉几个右边较大的(因为是从左到右,所以不用考虑左边),循环解决这些问题。
今天这场比赛还好,一共出了三个题,只不过hard version一道题也没出,相当于我只做出来了三个最简单的题,D题连题目都没看明白。而且出题速度还是非常慢,c题用了一个多小时,我觉得我还得更加集中精力,好好动动脑子,想不出来的时候要换个思路,多方面考虑,多活跃活跃思路,关键是这题难度不按顺序,所以老是在刚开始的时候无从下手,一般是看哪个题有人过了然后就去做哪个题(投机取巧),下次争取完全靠自己。下周继续加油

猜你喜欢

转载自blog.csdn.net/weixin_46434074/article/details/107282244
今日推荐