zoukankan      html  css  js  c++  java
  • 牛客编程巅峰赛S1第3场

    B.不可思议
    题目链接:https://ac.nowcoder.com/acm/contest/6220/B

    分析:可以发现对于u = i + 1, v = (s4 % i) + 1,也就是每次u都会连一个编号小于它的节点,那么我们可以直接开一个数组fa[],暴力往上爬,爬到根节点。

    using LL = long long;
    const int N = 100005;
    const int mod = 998244353;
    int fa[N];
    
    LL update(int x, int y)
    {
    	LL res = 0;
    	while (x)
    	{
    		res = res + ((y + 2 * x) ^ (y + x)) % mod;
    		x = fa[x];
    	}
    	return res % mod;
    }
    
    class Solution {
    public:
    	/**
    	 *
    	 * @param n int整型
    	 * @param seed1 long长整型
    	 * @param seed2 long长整型
    	 * @param seed3 long长整型
    	 * @param x int整型
    	 * @return long长整型
    	 */
    	long long work(int n, long long s1, long long s2, long long s3, int x) {
    		long long s4;
    		int u, v;
    		for (int i = 1; i < n; ++i)
    		{
    			s4 = (s1 + s2) % mod * s3 % mod;
    			u = i + 1, v = (s4 % i) + 1;
    			fa[u] = v;
    			s3 = s2;
    			s2 = s1;
    			s1 = s4;
    		}
    
    		LL lastans = 0;
    		LL ret = 0;
    		LL y = 0;
    		int z = 0;
    		for (int i = 1; i <= n; ++i)
    		{
    			z = update(x, y);
    			ret = (ret + z) % mod;
    			lastans = z;
    			x = ((x + lastans) ^ ret) % n + 1;
    			y = lastans;
    		}
    		return ret;
    	}
    };
    

    C.牛牛晾衣服
    题目链接:https://ac.nowcoder.com/acm/contest/6220/C

    分析:POJ原题-POJ3104,我们二分时间,对于时间t,如果一件衣服可以在自然时间内烘干,那么我们就不放进洗衣机里面。否则假设这件衣服用了t时间,那么a[i] - t * k <= mid - t,我们可以得到时间t,不等式的解为(t >= frac{a[i] - mid}{k - 1}),那么这些烘干衣服的时间只要小于总时间即可。

    bool check(int x, vector<int>& a, int k)
    {
    	int sum = 0;
    	for (int i = 0; i < a.size(); ++i)
    	{
    		if (a[i] > x)
    			sum += ceil((a[i] - x) * 1.0 / (k - 1));
    	}
    	if (sum > x) return false;
    	return true;
    }
    
    class Solution {
    public:
    	/**
    	 * 计算最少要多少时间可以把所有的衣服全烘干
    	 * @param n int整型 n件衣服
    	 * @param a int整型vector n件衣服所含水量数组
    	 * @param k int整型 烘干机1分钟可以烘干的水量
    	 * @return int整型
    	 */
    	int solve(int n, vector<int>& a, int k) {
    		int mx = 0;
    		for (int i = 0; i < a.size(); ++i)
    		{
    			mx = max(mx, a[i]);
    		}
    		int l = 1, r = mx;
    		while (l < r)
    		{
    			int mid = l + r >> 1;
    			if (check(mid, a, k)) r = mid;
    			else l = mid + 1;
    		}
    		return r;
    	}
    };
    
  • 相关阅读:
    自定义序列化类注意事项
    HashMap中的modCount
    transient
    30张图带你彻底理解红黑树(转)
    hashcode和hash算法
    线程池
    VS2015 NuGet错误:远程证书无效
    解决前台JS弹框Alert点击确定页面会刷新
    Regex中Replace方法的简单实用
    .ashx 一般处理程序
  • 原文地址:https://www.cnblogs.com/pixel-Teee/p/13326474.html
Copyright © 2011-2022 走看看