CF401
A.Vanya and Cards
题目大意:
给出
解题思路:
直接做做完了。统计一下原本
小代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+5;
int n,x;
int a[N];
int sum;
signed main()
{
scanf("%lld%lld",&n,&x);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
if (sum<0) sum=-sum;
printf("%lld",(sum+x-1)/x);
return 0;
}
B.Sereja and Contests
题目大意:
共有两类数,一类无限制,二类的数的值必须是一类某数的数值
题目中给出
解题思路:
最多的一类数的个数就是剩下的数的总数,统计一下即可。
最少的一类数一定是连续两个数中存在一个,只需统计剩下的数中连续两个数的个数(这就相当于是二类数的数量),再用最多的一类数的个数减去它就是答案
坏代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e3+5;
int n,k;
bool flag[N];
int ans1,ans2;
signed main()
{
scanf("%lld%lld",&n,&k);
for (int i=1;i<=k;i++)
{
int op,num1,num2;
scanf("%lld%lld",&op,&num1);
if (op==2) flag[num1]=true;
else
{
scanf("%lld",&num2);
flag[num1]=flag[num2]=true;
}
}
for (int i=1;i<n;i++)
{
if (!flag[i]) ans1++;
}
ans2=ans1;
for (int i=1;i+1<n;i++)
{
if (flag[i]==false&&flag[i+1]==false)
{
ans2--;
i++;
}
}
printf("%lld %lld",ans2,ans1);
return 0;
}
C.Team
题目大意:
给出
解题思路:
先考虑无法构造的情况。可以发现,数列中最多有
接下来考虑"
不好的代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,m;
string ans;
signed main()
{
cin>>n>>m;
if ((n+1)*2<m||m<n-1)
{
printf("-1");
return 0;
}
if (m==n*2+2) printf("11"),m-=2;
if (m==n*2+1) printf("1"),m--;
while (n<m&&n!=0&&m>0)
{
printf("0");
int cnt1=min(1LL*2,m);
m-=cnt1;
while (cnt1--) printf("1");
n--;
}
while (n!=0&&m!=0)
{
m--,n--;
printf("01");
}
while (m--) printf("1");
while (n--) printf("0");
cout<<ans;
return 0;
}
D.Roman and Numbers
题目大意:
不允许有前导0!
解题思路:
翻开题解发现是状压DP,果断放弃摆烂
于是复习了一下很久以前学的状压,就着几篇题解终于把这题吃了
注意到
设状态为
然后好像就没了?
先预处理出
状态转移方程(
f[i|(1<<j)][(k*10+a[j])%m][1]+=f[i][k][1]+f[i][k][0];
然后就水灵灵地做出来了?
水灵灵的代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5;
int n,m;
int cnt,a[20];
int vis[10];
int f[N][110][2];
signed main()
{
scanf("%lld%lld",&n,&m);
while (n)//处理n的数位
{
a[cnt++]=n%10;
n/=10;
}
f[0][0][0]=1;
for (int i=0;i<(1<<cnt);i++)//状态
{
memset(vis,0,sizeof vis);
for (int j=0;j<cnt;j++)//数位
{
if (i&(1<<j)||vis[a[j]]) continue;//前面的状态出现过或有重复的
vis[a[j]]=1;
for (int k=0;k<m;k++)//余数
{
if (a[j])
{
f[i|(1<<j)][(k*10+a[j])%m][1]+=f[i][k][0];
f[i|(1<<j)][(k*10+a[j])%m][1]+=f[i][k][1];
}
else f[i|(1<<j)][(k*10+a[j])%m][1]+=f[i][k][1];
}
}
}
printf("%lld",f[(1<<cnt)-1][0][1]);
return 0;
}
E题没了,嗨皮恩定
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效