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
表示利用i到9的数字能拼成的长度为len的所有可能数
状态转移方程:
相当于是在用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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通