Virtual Judge CF 专场

Virtual Judge CF 专场

CF专场 - Virtual Judge (vjudge.net)

A

枚举,从1到d,如果能被k,l,m,n中的任意一个整除,则答案+1

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int k,l,m,n,d;
	cin>>k>>l>>m>>n>>d;
	int res=0;
	for(int i=1;i<=d;i++)
	{
		if(i%k==0||i%l==0||i%m==0||i%n==0) res++;
	}
	cout<<res;
}

B

按着题目模拟

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int vp,vd,t,f,c;
	cin>>vp>>vd>>t>>f>>c;
	if(vd<=vp) cout<<0;
	else
	{
		int res=0;
		double x=vp*t;
		while(true)
		{
			double t1=x/(vd-vp)*1.0;
			x+=t1*vp;
			if(x>=c) break;
			else
			{
				res++;
				x+=(vp*(f+t1));
			}
		}
		cout<<res;
	}
}

C

也是模拟,注意细节,先将1和3配、2和2配,多的1可以多的2配

#include <bits/stdc++.h>
using namespace std;
int a[4];
int main()
{

    int n;
    cin >> n;
    int res = 0;
    for (int i = 0; i < n; i++)
    {
        int x;
        cin >> x;
        if (x == 4)
        {
            res++;
        }
        else
        {
            a[x]++;
        }
    }
    res += (a[2] / 2);
    a[2] %= 2;
    if (a[1] <= a[3])
    {
        res += a[3];
        a[1] = 0;
    }

    else
    {
        res += a[3];
        a[1] -= a[3];
        res += (a[1] / 4);
        a[1] %= 4;
    }
    int k = a[1] + a[2] * 2;
    if (k <= 4 && k != 0)
        res++;
    else if (k != 0)
        res += 2;
    cout << res;
}

D

列个方程推一下就得到三个数了

#include<bits/stdc++.h>
using namespace std;
int a[3],b[3][3];
int main()
{
	for(int i=0;i<3;i++)
	{
		int sum=0;
		for(int j=0;j<3;j++)
		{
			cin>>b[i][j];
			sum+=b[i][j];
		}
		a[i]=sum;
	}
	b[1][1]=(a[2]-a[1]+a[0])/2;
	b[2][2]=a[0]-b[1][1];
	b[0][0]=a[2]-b[1][1];
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			cout<<b[i][j]<<" ";
		}
		cout<<endl;
	}
}

E

小细节,如果全是1就去掉一个1,否则去掉第一个0

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	cin>>s;
	bool flag=true;
	for(int i=0;i<s.size();i++)
	{
		if(flag && s[i]=='0') 
		{
			flag=false;
			continue;
		}
		else if(flag && i==s.size()-1) break;
		cout<<s[i];
	}
}

F

题目简单,但是坑多,

能够模2模5则结尾必然为0,

看各个位的和是否为3,模拟

注意不能输出前导0,输出需要特判

#include <bits/stdc++.h>
using namespace std;
int s[100005];
int res[100005];
vector<int> a0, a1, a2;
bool cmp(int a, int b)
{
    return a > b;
}

int main()
{
    int n;

    cin >> n;
    long long sum = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> s[i];
        if (s[i] % 3 == 0)
            a0.push_back(s[i]);
        if (s[i] % 3 == 1)
            a1.push_back(s[i]);
        if (s[i] % 3 == 2)
            a2.push_back(s[i]);
        sum += s[i];
    }
    sort(a0.begin(), a0.end(), cmp);
    sort(a1.begin(), a1.end(), cmp);
    sort(a2.begin(), a2.end(), cmp);
    int cnt = 0;
    sort(s + 1, s + 1 + n);
    if (s[1] != 0)
    {
        cout << -1 << endl;
    }
    else
    {
        if (sum % 3 == 0)
        {
            for (int i = n; i >= 1; i--)
            {
                cnt++;
                res[cnt] = s[i];
            }
        }
        else if (sum % 3 == 1)
        {
            if (a1.size() > 0)
            {
                a1.pop_back();
            }
            else if (a2.size() > 1)
            {
                a2.pop_back();
                a2.pop_back();
            }
            for (int i = 0; i < a1.size(); i++)
            {
                cnt++;
                res[cnt] = a1[i];
            }
            for (int i = 0; i < a0.size(); i++)
            {
                cnt++;
                res[cnt] = a0[i];
            }
            for (int i = 0; i < a2.size(); i++)
            {
                cnt++;
                res[cnt] = a2[i];
            }
        }
        else if (sum % 3 == 2)
        {
            if (a2.size() > 0)
            {
                a2.pop_back();
            }
            else if (a1.size() > 1)
            {
                a1.pop_back();
                a1.pop_back();
            }
            for (int i = 0; i < a1.size(); i++)
            {
                cnt++;
                res[cnt] = a1[i];
            }
            for (int i = 0; i < a0.size(); i++)
            {
                cnt++;
                res[cnt] = a0[i];
            }
            for (int i = 0; i < a2.size(); i++)
            {
                cnt++;
                res[cnt] = a2[i];
            }
        }
        sort(res + 1, res + 1 + cnt);
        bool flag = 0;
        for (int i = cnt; i >= 1; i--)
        {
            if (res[i] != 0)
                flag = 1;
            if (flag == 1 || i == 1)
                cout << res[i];
        }
        cout << endl;
    }
    return 0;
}

G

拓扑排序+贪心

#include <bits/stdc++.h>
using namespace std;
vector<int> mp[15000];
int d[5][5], a[250], deg[250], temp[205], n;
int tooper(int ss)
{
    queue<int> s;
    int ans = n, cnt = 0, now = ss;
    while (1)
    {
        while (1)
        {
            int flag = 0;
            for (int i = 1; i <= n; ++i)
            {
                if (deg[i] == 0 && a[i] == now)
                {
                    flag = 1;
                    deg[i] = -1;
                    cnt++;
                    for (int j = 0; j < mp[i].size(); ++j)
                    {
                        int v = mp[i][j];
                        deg[v]--;
                    }
                }
            }
            if (flag == 0)
                break;
        }
        if (cnt == n)
            break;
        now++;
        ans++;
        now = (now == 4 ? 1 : now);
    }
    return ans;
}

int main()
{
    d[1][1] = d[2][2] = d[3][3] = 0;
    d[1][2] = d[2][3] = d[3][1] = 1;
    d[2][1] = d[3][2] = d[1][3] = 0x3f3f3f3f;
    cin>>n;
    for (int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    for (int i = 1; i <= n; ++i)
    {
        int k;
        scanf("%d", &k);
        for (int j = 1; j <= k; ++j)
        {
            int x;
            scanf("%d", &x);
            mp[x].push_back(i);
            deg[i]++;
        }
    }
    for (int i = 1; i <= n; ++i)
        temp[i] = deg[i];
    int ans = 0x3f3f3f3f;
    for (int i = 1; i <= n; ++i)
        deg[i] = temp[i];
    ans = min(ans, tooper(1));
    for (int i = 1; i <= n; ++i)
        deg[i] = temp[i];
    ans = min(ans, tooper(2));
    for (int i = 1; i <= n; ++i)
        deg[i] = temp[i];
    ans = min(ans, tooper(3));
    printf("%d\n", ans);
}

H

dp[i][len]表示利用i到9的数字能拼成的长度为len的所有可能数
状态转移方程:dp[i][len]=Σi+19(dp[i+1][lenk]C[len][k])
相当于是在用i+1到9凑成的长度为len-k的数字串里面塞进去k个i的所有可能数。用乘法原理可知去掉已经统计出来的len-k,我们要处理的就是从len里面选k个位置来放i。
注意:由于前导零不用考虑,而且只要统计正整数,所以我们在放0的时候,是不能让零放在第一位的,对于0我们可以特殊处理一下。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
 
typedef __int64 LL;
 
const int maxn = 111;
const int mod = 1e9 + 7;
 
int dig[22],n;
LL dp[22][maxn];
 
LL C[maxn][maxn];
void pre() {
    memset(C, 0, sizeof(C));
    C[0][0] = 1;
    for (int i = 1; i < maxn; i++) {
        C[i][0] = 1;
        for (int j = 1; j <= i; j++) {
            C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
            C[i][j] %= mod;
        }
    }
}
 
int main() {
    pre();
    scanf("%d", &n);
    for (int i = 0; i < 10; i++) {
        scanf("%d", &dig[i]);
    }
    memset(dp, 0, sizeof(dp));
    dp[10][0] = 1;
    for (int i = 9; i > 0; i--) {
        for (int j = 0; j < maxn; j++) {
            for (int k = dig[i]; k <=j; k++) {
                dp[i][j] += dp[i + 1][j - k] * C[j][k];
                dp[i][j] %= mod;
            }
        }
    }
    for (int j = 0; j < maxn; j++) {
        for (int k = dig[0]; k < j; k++) {
            dp[0][j] += dp[1][j - k] * C[j - 1][k];
            dp[0][j] %= mod;
        }
    }
    LL ans = 0;
    for (int j = 1; j <= n; j++) {
        ans += dp[0][j];
        ans %= mod;
    }
    printf("%I64d\n", ans);
    return 0;
}
posted @   扶木  阅读(337)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示