zoukankan      html  css  js  c++  java
  • Codeforces Round #674 (Div. 3) (A

    A. Floor Number

    https://codeforces.com/contest/1426/problem/A

    题意:

    一个楼房房间号由 (1) 递增,一楼仅2个房间。给定一位用户的房间号和 (2)楼以上每层的房间数(x)

    求出用户所在楼层

    思路:

    很简单,理解题意即可。

    如果 (n≤2) ,则答案为1。否则,您可以“删除”第一层,然后答案为 (⌊frac{n-3}{x}⌋+ 2。)

    #python
    for i in range(int(input())):
        n, x = map(int, input().split())
        print(1 if n <= 2 else (n - 3) // x + 2)
    
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main() {
    	//freopen("in.txt", "r", stdin);
    	ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    	int _; cin >> _; while (_--) {
    		ll n, x;
    		cin >> n >> x;
    		if (n <= 2)cout << 1 << endl;
    		else cout << (n - 3) / x + 2 << endl;
    	}
    }
    

    B. Symmetric Matrix

    https://codeforces.com/contest/1426/problem/B

    题目有点长,大家点击链接看原题 或者 题意↓

    题意:

    给定 n 种 2 x 2大小的方块,问是否能通过这些方块组成 m x m的矩形(需要 (s[i][k] = s[j][i]))

    思路:

    首先,如果m为奇数,则出于显而易见的原因,答案为“否”。 否则,我们会注意到图块的左上角和右下角值无关紧要(因为我们可以对称放置图块)。 因此,我们只需要检查是否有一些图块的右上值等于其左下值(因为这是我们获得主对角线对称性的方式)。

    #python
    for i in range(int(input())):
    	n, m = map(int, input().split())
    	a = []
    	for i in range(n):
    		a.append([[int(x) for x in input().split()] for i in range(2)])
    	ok = False
    	for i in range(n):
    		ok |= a[i][0][1] == a[i][1][0]
    	ok &= m % 2 == 0
    	print("YES" if ok else "NO") 
    
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    void solve() {
    	ll n, m;
    	cin >> n >> m;
    	ll a, b, c, d;
    	bool f1 = 0, f2 = 0;
    	for (int i = 1; i <= n; ++i) {
    		cin >> a >> b >> c >> d;
    		if (!f2 && b == c)f2 = 1;
    	}
    	if (m % 2 == 0)f1 = 1;
    	if (f1 && f2)cout << "YES" << endl;
    	else cout << "NO" << endl;
    }
    
    int main() {
    	//freopen("in.txt", "r", stdin);
    	ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    	int _; cin >> _; while (_--)solve();
    }
    

    C. Increase and Copy

    https://codeforces.com/contest/1426/problem/C

    题意:

    思路:

    直观地说,我们首先需要进行所有增量操作,然后才需要复制数字(因为否则我们可以交换移动顺序,并且总和不会减少)。 您可能会注意到答案不超过 (O(sqrt{n})),所以我们可以从1迭代到⌊(O(sqrt{n}))⌋,然后确定要复制的数字。 设为x。 那么我们需要x-1个移动来获得它,还需要⌈(frac{n-x}x)⌉个移动来获得足够数量的副本。 因此,我们可以用此举数来更新答案。
    时间复杂度:每个测试用例为(O(sqrt{n}))
    实际上,所需的数字总是非常接近⌊(O(sqrt{n}))⌋,因此只要尝试在[⌊(O(sqrt{n}))⌋-5; ⌊(O(sqrt{n}))⌋ + 5]范围内进行一些选择就足够了。 回答。 这是 (O(1))解决方案。

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
    	//freopen("in.txt", "r", stdin);
    	ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    	int t;
    	cin >> t;
    	while (t--) {
    		int n;
    		cin >> n;
    		int ans = 1e9;
    		for (int x = 1; x * x <= n; ++x) {
    			ans = min(ans, x - 1 + ((n - x) + x - 1) / x);
    		}
    		cout << ans << endl;
    	}
    }
    

    D. Non-zero Segments

    https://codeforces.com/contest/1426/problem/D

    从开始遍历,利用sum去统计前面一段的值。

    如果已经出现过,说明会导致有区间和为0的情况出现,ans++并且map clear 重新计数 sum从当前开始.

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main() {
    	//freopen("in.txt", "r", stdin);
    	ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    	int n; cin >> n;
    	map<ll, ll>m;
    	ll ans = 0, sum = 0, x;
    	m[0]++;
    	for (int i = 0; i < n; ++i) {
    		cin >> x;
    		sum += x;
    		if (m[sum] > 0) {
    			ans++;
    			sum = x;
    			m.clear();
    			m[0]++;
    		}
    		m[sum]++;
    	}
    	cout << ans;
    }
    

    E. Rock, Paper, Scissors

    https://codeforces.com/contest/1426/problem/E

    Alice 和 Bob这次开始玩猜拳了,给定他们玩的次数n,和石头剪刀布出现的次数,求Alice能赢的最多次数和最少次数。

    思路:

    赢最多不用说吧?

    赢最少, 无非是 拳头被拳头和包吃了, 剪刀被剪刀和石头吃了, 包被拳头和包吃了

    抵消完后, 要么你剩下拳头/剪刀/包, 对手剩下剪刀/包/拳头, 这就是你最少赢的

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    ll q_max(ll x, ll y, ll z, ll h) {
    	x = x > y ? x : y;
    	x = x > z ? x : z;
    	x = x > h ? x : h;
    	return x;
    }
    
    int main() {
    	//freopen("in.txt", "r", stdin);
    	ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    	ll n, a, b, c, x, y, z;
    	cin >> n;
    	cin >> a >> b >> c >> x >> y >> z;
    	cout << q_max(0, a - x - z, b - x - y, c - y - z ) << " " << min(a, y) + min(b, z) + min(c, x);
    }
    

    F. Number of Subsequences

    没做出来

    先贴一下dalao的代码留做学习

    #include<bits/stdc++.h>
    using namespace std;
    const int mod = 1e9 + 7;
    typedef ll ll;
    int main() {
        int n; cin >> n;
        string ss; cin >> ss;
        ll x = 0;
        ll ans = 0;
        ll temp = 0;
        ll num = 1;
        for (int i = 0; i < n; i++) {
            if (ss[i] == 'a') x += num;
            else if (ss[i] == 'b') temp += x;
            else if (ss[i] == 'c') ans += temp;
            else {
                ans = ans * 3 + temp;
                temp = temp * 3 + x;
                x = x * 3 + num;
                num *= 3;
            }
            num %= mod;
            x %= mod; temp %= mod; ans %= mod;
        }
        cout << ans << endl;
    }
    

    学习隔壁 洛绫璃dalao 的写法:

    利用模拟思想:

    题目问我们能组成 abc 的可能性,需要在3^k的情况取模

    先把可能的情况标出来以后再处理

    1~~a
    2~~?
    3~~ab
    4~~a?
    5~~?b
    6~~??
    7~~abc
    8~~ab?
    9~~a?c
    10~~?bc
    11~~a??
    12~~?b?
    13~~??c
    14~~???
    
    #include <bits/stdc++.h>
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
    using namespace std;
    typedef long long ll;
    const int N = 2e5 + 5, mod = 1e9 + 7;
    int n, m, _, k;
    char s[N];
    ll a[20], ans = 0;
    int qpow(ll a, ll b) {//快速幂
        ll ans = 1; a %= mod;
        for (; b; a = a * a % mod, b >>= 1)
            if (b & 1) ans = ans * a % mod;
        return ans;
    }
    int main() {
        IOS; cin >> n;
        cin >> s + 1;
        rep(i, 1, n)
            if (s[i] == 'a') ++a[1];
            else if (s[i] == 'b') {
                a[3] += a[1];
                a[5] += a[2];
            }
            else if (s[i] == 'c') {
                a[7] += a[3];
                a[9] += a[4];
                a[10] += a[5];
                a[13] += a[6];
            }
            else {
                a[14] += a[6];
                a[12] += a[5];
                a[11] += a[4];
                a[8] += a[3];
                a[6] += a[2];
                a[4] += a[1];
                ++a[2];
            }
        //如果存在这种可能性,利用相应组合计算
        if (a[7]) ans = a[7] % mod * qpow(3, a[2]) % mod;
        if (a[8]) ans = (ans + a[8] % mod * qpow(3, a[2] - 1) % mod) % mod;
        if (a[9]) ans = (ans + a[9] % mod * qpow(3, a[2] - 1) % mod) % mod;
        if (a[10]) ans = (ans + a[10] % mod * qpow(3, a[2] - 1) % mod) % mod;
        if (a[11]) ans = (ans + a[11] % mod * qpow(3, a[2] - 2) % mod) % mod;
        if (a[12]) ans = (ans + a[12] % mod * qpow(3, a[2] - 2) % mod) % mod;
        if (a[13]) ans = (ans + a[13] % mod * qpow(3, a[2] - 2) % mod) % mod;
        if (a[14]) ans = (ans + a[14] % mod * qpow(3, a[2] - 3) % mod) % mod;
        cout << ans;
        return 0;
    }
    

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    为什么32位系统最大支持4G内存??我自己悟出来了 终于 。。。。。
    关于 Delphi 中流的使用(1) 用 TMemoryStream(内存流) 入门 &&& 关于指针的迷惑,我自己问的.
    关于多态的理解,有助于理解TStream抽象类的多态机制。
    FP-Tree频繁模式树算法
    FP-Tree频繁模式树算法
    分布式系统阅读笔记(二十一)-----分布式系统设计(Google Case Study)
    分布式系统阅读笔记(二十一)-----分布式系统设计(Google Case Study)
    分布式系统阅读笔记(二十一)-----分布式系统设计(Google Case Study)
    链接挖掘算法之PageRank算法和HITS算法
    链接挖掘算法之PageRank算法和HITS算法
  • 原文地址:https://www.cnblogs.com/RioTian/p/13747007.html
Copyright © 2011-2022 走看看