2024.08.10京东

1. 牛牛喝醉

牛牛昨晚喝醉了,走路开始疯狂摇摆,方向也分不清了。假设他所在的地方是一个二维平面,开始它位于坐标为(0,0)的地方,
并且面朝北方即y轴正方向。W表示牛牛向前走,A表示牛牛把当前方向向左转90度,D表示牛牛把方向向右转90度,S表示牛牛呆在原地。
给出一个字符串表示牛牛的酒后行为方式,你能告诉他走完后它位于哪个坐标点吗?

简单模拟题
int main(int argc, char *argv[]) {
    int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
    string beseq;
    cin>>beseq;
    int x = 0; int y = 0;
    int diridx = 0;
    for(auto c:beseq){
        switch (c){
            case 'W':
                x = x + dir[diridx][0];
                y = y + dir[diridx][1];
                break;
            case 'A': //左转
                diridx = (diridx+3)%4;
                break;
            case 'D'://右转
                diridx = (diridx+1)%4;
                break;
            default:
                break;
        }
    }
    cout<<x<<" "<<y;
    return 0;
}

2. 对的个数

给定长度为N的序列a和非负整数X。找出满足ai+aj=X的(i,j)对的数量。

哈希计数
int main(int argc, char *argv[]) {
    int N; int X;
    cin>>N>>X;
    int res = 0;
    unordered_map<int,int> m;
    for(int i=0;i<N;i++){
        int num;
        cin>>num;
        if(num==X-num) res++;
        if(m.count(X-num))
            res = res + m[X-num]*2;
        m[num]++;
    }
    cout<<res;
    return 0;
}

3. 牛牛操作数组

牛牛有一个长度为n且值都为0的数组a。对于这个数组件牛每次操作可以选择一个区间[l,r],
对于[l,r]上的每一个数牛牛必须让其加一或者乘二(元素之间操作独立,可以选择一些元素乘二,一些元素加一,但是区间内每个元素都要操作)。
牛牛还有一个目标数组b,牛牛想知道对于初始数组a来说,其最少操作多少次可以将其变为b呢。

找到规律,使得0变为目标二进制数的操作次数最少是,其位数+1的个数-1

int main(int argc, char *argv[]) {
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int res = 0;
        int num;
        for(int i=0;i<n;i++){
            int times = 0;
            cin>>num;
            while(num){
                times += num%2;
                num/=2;
                times ++;
            }
            res = max(res,times-1);
        }
        cout<<res<<endl;;
    }
    return 0;
}
posted @ 2024-09-06 20:56  失控D大白兔  阅读(17)  评论(0编辑  收藏  举报