牛客周赛 Round 7 A ~ D

题目:https://ac.nowcoder.com/acm/contest/63091

A 游游的you矩阵

枚举

#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'

using namespace std;

typedef pair PII;
typedef long long ll;

const int N = 1010;

int n, m;
char a[N][N];

bool check(int x, int y)
{
	int A = 0, b = 0, c = 0;
	if(a[x][y] == 'y' || a[x + 1][y] == 'y' ||a[x][y + 1] == 'y' || a[x + 1][y + 1] == 'y')A = 1;
	if(a[x][y] == 'o' || a[x + 1][y] == 'o' ||a[x][y + 1] == 'o' || a[x + 1][y + 1] == 'o')b = 1;
	if(a[x][y] == 'u' || a[x + 1][y] == 'u' ||a[x][y + 1] == 'u' || a[x + 1][y + 1] == 'u')c = 1;
	if(A && b && c)return true;
	return false;
}

int main()
{
	IOS
	cin >> n >> m;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i] + 1;
	}
	ll ans = 0;
	for(int i = 1; i < n; i ++)
	{
		for(int j = 1; j < m; j ++)
		{
			if(check(i, j))ans ++;
		}
	}
	cout << ans;
	
	return 0;
}

 B 游游的01串操作

第一位固定之后剩下的数组就都固定了,所以其实只有两种情况

#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'

using namespace std;

typedef pair PII;
typedef long long ll;

int main()
{
	IOS
	string s;
    cin >> s;
	ll ans1 = 0, ans2 = 0;
	for(int i = 0; i < s.size(); i ++)
	{
		if(s[i] - '0' != i % 2)ans1 += i + 1;
		if(s[i] - '0' != (i + 1) % 2)ans2 += i + 1;
	}
	cout << min(ans1, ans2);
	
	return 0;
}

C 游游的正整数

 设res = b - a, 可以将问题转化为从0加到res需要的最少次数和最多次数。

加一次后可到的范围为[l, r], 加两次后可到的范围为[l * 2, r * 2], ..., 加n次后可到的范围为[l * n, r * n],所以第一次r * n >= res的n就是最小次数,然后第一次l * n > res的n再减一就是最多次数,区间无论如何也覆盖不到res时输出-1

#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'

using namespace std;

typedef pair PII;
typedef long long ll;

void solve()
{
	ll l, r, a, b;
	cin >> a >> b >> l >> r;
	ll res = b - a, num = (res + r - 1) / r;
    if(res < num * l)
    {
        cout << -1 << endl;
        return;
    }
    
    ll ans1 = num;
    ll ans2 = res / l;
    cout << ans1 << " " << ans2 << endl;
}

int main()
{
	IOS
	int _;
	cin >> _;
	while(_ --)
	{
		solve();
	}
	
	return 0;
}

D 游游的选数乘积

 末尾有几个零 -> 看每个数中2和5的个数

用f[i][j]表示2的个数 <= i个、5的个数 <= j个 的数字个数

#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'

using namespace std;

typedef pair PII;
typedef long long ll;

const int N = 40;

int n, x;
int f[N][N];

int main()
{
	IOS
	cin >> n >> x;
    ll ans = 0;
	for(int i = 1; i <= n; i ++)
	{
		int ai, two = 0, five = 0;
		cin >> ai;
		int tmp = ai;
		while(tmp % 2 == 0)two ++, tmp >>= 1;
		while(ai % 5 == 0)five ++, ai /= 5;
        ans += f[max(0, x - two)][max(0, x - five)];
        
        for(int j = two; j >= 0; j --)
        {
            for(int k = five; k >= 0; k --)
            {
                f[j][k] ++;
            }
        }
	}
    cout << ans;
	
	return 0;
}

你可能感兴趣的:(牛客,c++,算法)