CF1950 A~G
前言
报了名没打的一场 Div. 4,我是怎么想到回去做的呢?上课的时候无聊于是随机了一道 1700 的题,找到了本场比赛的 F 题,我那时还没发现。过了差不多
CF1950A
难度:800
直接比较三数即可。
CF1950B
难度:800
把每 #
。
CF1950C
难度:800
除了
CF1950D
难度:1100
先简化题意:一个数 0
和 1
组成的数的乘积。注意到这种数不多,枚举出来,计算哪些
CF1950E
难度:1500
显然
#include <bits/stdc++.h>
using namespace std;
set<string> st;
map<string,int> mp;
int check(string s,string t)
{
int cnt=0;
for(int i=0;i<s.size();i++) cnt+=(s[i]!=t[i]);
if(cnt>1) return 0;
return 1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
string s;
cin>>s;
s=' '+s;
for(int i=1;i<=n;i++)
{
if(n%i) continue;
st.clear();
mp.clear();
for(int j=1;j<=n;j+=i)
{
string t=s.substr(j,i);
st.insert(t);
mp[t]++;
}
if(st.size()>2)
{
continue;
}
if(st.size()==1)
{
cout<<i<<'\n';
break;
}
if((mp[*st.begin()]>1&&mp[*(++st.begin())]>1)||!check(*st.begin(),*(++st.begin())))
{
continue;
}
cout<<i<<'\n';
break;
}
}
}
CF1950F
难度:1700
点数不变,那么平均每层节点越多,深度越小。不难联想到对于某一层来说,它的节点最大值与它上一层节点个数和剩余节点数量有关。因此应尽可能地把子节点最多的那
#include <bits/stdc++.h>
using namespace std;
vector<int> G[300010];
int dep[300010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
int a,b,c,now=1;
cin>>a>>b>>c;
for(int i=1;i<=a+b+c;i++) G[i].clear(),dep[i]=0;
queue<int> q;
q.push(1);
while(q.size())
{
int u=q.front();
q.pop();
if(a)
{
a--;
G[u].push_back(++now);
q.push(now);
dep[now]=dep[u]+1;
G[u].push_back(++now);
q.push(now);
dep[now]=dep[u]+1;
}
else if(b)
{
b--;
G[u].push_back(++now);
q.push(now);
dep[now]=dep[u]+1;
}
else c--;
}
if(a||b||c)
{
cout<<-1<<'\n';
continue;
}
int ans=0;
for(int i=1;i<=now;i++) ans=max(ans,dep[i]);
cout<<ans<<'\n';
}
}
CF1950G
观察到
这题有点卡常,需要注意一些事情,否则就会如图。
要注意的几点:
-
popcount 提前处理好,最好是在多测开始前就把
的每个数的 popcount 处理好。 -
关闭同步流或使用 scanf 读入或开快读。
-
歌曲流派与作者先离散化,否则常数很大。
-
记录一个
表示是否计算过 ,如果搜索到状态 时 就直接退出本次搜索。 -
多测清空。
#include <bits/stdc++.h>
using namespace std;
string g[20],w[20];
int g2[20],w2[20],cl[1<<17];
int dp[1<<17][20],n,cnt=0,vis[1<<17][20];
map<string,int> mp;
void dfs(int sta,int lst)
{
if(vis[sta][lst]) return;
vis[sta][lst]=1;
dp[sta][lst]=1;
for(int i=0;i<n;i++)
{
if((sta>>i&1)||(g2[i]!=g2[lst]&&w2[i]!=w2[lst]))
{
vis[sta+(1<<i)][i]=1;
continue;
}
dfs(sta+(1<<i),i);
}
}
int calc(int k)
{
int ret=0;
for(int i=0;i<16;i++) ret+=k>>i&1;
return ret;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin>>t;
for(int i=0;i<(1<<16);i++) cl[i]=calc(i);
while(t--)
{
mp.clear();
int ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>g[i]>>w[i];
if(!mp[g[i]]) mp[g[i]]=++cnt;
if(!mp[w[i]]) mp[w[i]]=++cnt;
g2[i]=mp[g[i]];
w2[i]=mp[w[i]];
}
for(int i=0;i<(1<<n);i++)
for(int j=0;j<n;j++)
dp[i][j]=vis[i][j]=0;
for(int i=0;i<n;i++) dfs(1<<i,i);
for(int i=0;i<(1<<n);i++)
for(int j=0;j<n;j++)
ans=max(ans,dp[i][j]*cl[i]);
cout<<n-ans<<'\n';
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?