洛谷P1161 开灯

Posted ZSYL

tags:

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

题目描述

异或

异或就是把两个数拆成二进制,一位一位比较,某一位上一样返回0,不一样返回1。

一个数异或它本身得到0(因为每一位都一样全部返回0)

因此我们只需要设 ans=0 然后把所有的数异或一遍。因为只有一盏灯是开的,也就是说,其他编号出现的次数都是成对的,异或完都是0,剩下的那一个与0异或得它本身。因此最后ans就是结果。

JAVA

直接暴力,异或实现开关灯操作。

import java.util.Scanner;

public class Main 
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] x = new int[2000001];
        int index = 0;
        while (n-- > 0) 
            double a = sc.nextDouble();
            int t = sc.nextInt();
            for (int i = 1; i <= t; i++) 
                index = (int)(a*i);
                x[index] ^= 1;
            
        
        for (int i = 1; i < 2000001; i++) 
            if (x[i] == 1) 
                index = i;
                break;
            
        
        System.out.println(index);
    

C++

#include<iostream>
#include<bits/stdc++.h> //万能头文件
using namespace std;

int a[2000001], n;
double x, y;

int main()

    cin >> n;
    while (n-- > 0) 
        cin >>x>>y;
        for (double i = 1; i <= y; i++) 
            a[int(i*x)] ^= 1;
        
    
    for (int i = 1;;i++) 
        if (a[i] == 1) 
            cout << i;
            break;
        
    
    return 0;

大佬牛!

#include<bits/stdc++.h> //万能头文件
#define f(i,j,n) for(i=j;i<=n;i++) //for循环简写,福利福利~
using namespace std;
int main()

    ios::sync_with_stdio(false); //cin,cout快读快输,写scanf和printf的就不要加了,会RE
    int n,t,i,j,ans=0;
    double a; //为了保险我们还是开double
    cin>>n;
    f(i,1,n)
    
        cin>>a>>t;
        f(j,1,t)
            ans^=int(j*a); //重点:位运算,直接异或,这里注意要用int强制把j*a的值转换成整型
    
    cout<<ans<<endl; //输出ans即可
    return 0; //华丽丽地结束


加油!

感谢!

努力!

以上是关于洛谷P1161 开灯的主要内容,如果未能解决你的问题,请参考以下文章

P1161 开灯

洛谷 P1876 开灯

9509 开灯

10岁男孩开灯睡觉骨龄发育慢4年上热搜,开灯睡觉都有什么危害?

开灯问题

9509 开灯(dfs)