[arc080f]Prime Flip
来源:互联网 发布:2.5d弧面玻璃淘宝有吗 编辑:程序博客网 时间:2024/06/06 19:05
题目大意
有无穷个硬币,初始有n个正面向上,其余均正面向下。
你每次可以选择一个奇质数p,并将连续p个硬币都翻转。
问最小操作次数使得所有硬币均正面向下。
做法
不妨考虑差分。差分后1的数量一定为偶数。
然后一次操作[l,r]会翻转两端l-1与r。
现在问题变成两两配对使得操作次数尽量少。
有三种情况:
1、|i-j|是奇质数,那么1步即可。
2、|i-j|是偶数,那么2步即可。(2可以5-3,4可以7-3,>=6的可以哥德巴赫猜想)
3、|i-j|是奇非质数,那么3步即可。(1可以7-3-3,然后最小的奇合数是9,>=9的可以拆分成3+一个>=6的偶数,可以哥德巴赫猜想)
按奇偶变成二分图,希望1的情况尽量少,剩余尽量2的情况,实在不行补一次3的情况。
匈牙利即可。
#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int maxn=200+10,maxd=10000000+10;int x[maxn],s[maxd],pri[maxd],r[maxn],a[maxn],b[maxn];bool bz[maxd],dis[maxn][maxn],pd[maxn];int i,j,k,l,t,n,m,tot,top,num,sum,tmp,ans;void prepare(){ bz[1]=1; fo(i,2,maxd-10){ if (!bz[i]) pri[++top]=i; fo(j,1,top){ if ((ll)i*pri[j]>maxd-10) break; bz[i*pri[j]]=1; if (i%pri[j]==0) break; } }}bool dfs(int x){ int i; fo(i,1,sum) if (dis[x][i]&&!pd[i]){ pd[i]=1; if (!r[i]||dfs(r[i])){ r[i]=x; return 1; } } return 0;}int main(){ prepare(); scanf("%d",&n); fo(i,1,n){ scanf("%d",&x[i]); s[x[i]]^=1; } fo(i,1,maxd-9){ if (s[i]!=s[i-1]){ if (i%2==1) a[++num]=i; else b[++sum]=i; } } fo(i,1,num) fo(j,1,sum) if (!bz[abs(a[i]-b[j])]) dis[i][j]=1; fo(i,1,num){ fo(j,1,sum) pd[j]=0; if (dfs(i)) tmp++; } ans+=2*((num-tmp)/2); ans+=2*((sum-tmp)/2); ans+=tmp; if (num%2!=tmp%2) ans+=3; printf("%d\n",ans);}
阅读全文
0 0
- [arc080f]Prime Flip
- flip
- flip
- Prime
- prime
- Prime
- prime
- Prime
- prime
- prime
- PRIME
- prime
- Prime
- Flip-flop
- Flip coins
- Flip Game
- Flip Game
- Flip Game
- windows下搭建基于nginx的rtmp服务器
- 想成为前端开发工程师,不能再错过这次机会了
- HDU 4279Number (打表找规律)
- Spring Cloud分布式微服务云架构图
- 想成为前端开发工程师,不能再错过这次机会了
- [arc080f]Prime Flip
- gunicorn源码分析
- HTML DIV 浏览器屏幕居中显示方法(CSS)
- MVP 模式简单易懂的介绍方式
- 类:实验2家中的电视
- COCOS2D-X Battle 独立游戏 (一) 第一版文案
- phpexcel 找不到xmlwriter问题的解决
- 万里长征第一步
- [arc058d]Iroha and a Grid