博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #461 (Div. 2)
阅读量:5043 次
发布时间:2019-06-12

本文共 3567 字,大约阅读时间需要 11 分钟。

A - Cloning Toys

/*    题目大意:给出两种机器,一种能将一种原件copy出额外一种原件和一个附件,    另一种可以把一种附件copy出额外两种附件,给你一个原件,    问能否恰好变出题目要求数量的原件和附件    题解:注意当附件需求不为0的时候,原件需求必须大于1*/#include 
#include
int main(){ int a,b; scanf("%d%d",&a,&b); if((a-b+1)%2==0&&a-b+1>=0&&b>1||(a==0&&b==1))puts("Yes"); else puts("No"); return 0;}

B - Magic Forest

/*    题目大意:求n以内的三个数字使得其异或和为0且能构成三角形的三边*/#include 
#include
using namespace std;int n,ans=0;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ int k=i^j; if(k
j&&k<=n)ans++; } }printf("%d\n",ans); return 0;}

C - Cave Painting

/*    题目大意:问是否n对1-k的数取模答案均不相同    题解:要达到题目要求,我们发现有n%i=i-1,即(n+1)%i=0*/#include 
#include
using namespace std;long long n,k; int main(){ scanf("%lld%lld",&n,&k); for(long long i=1;i<=k;i++){ if((n+1)%i){puts("No");return 0;} }puts("Yes"); return 0;}

D - Robot Vacuum Cleaner

/*    题目大意:给出一些s和h组成的串,求将其拼合在一起能组成的最多的sh序列    题解:我们发现拼接顺序的变化只对相邻两个串的答案有影响,所以我们根据这点排序,    然后顺序统计即可*/#include 
#include
#include
using namespace std;const int N=100010;struct data{long long s,h;}p[N];bool cmp(data a,data b){ return a.s*b.h>a.h*b.s;}char s[N];int n;long long ans=0;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ p[i].s=0; p[i].h=0; scanf("%s",s); int len=strlen(s); for(int j=0;j

E - Birds

/*    题目大意:每棵树召唤鸟的代价都是不同的,每棵树上最多有c只鸟,    每当召唤一只鸟魔法上限会提升,每走到下一棵树魔法会回复X,但是最多不能超过上限,    不能往回走,问最多能召唤几只鸟    题解:dp[i][j]表示到达第i棵树一共召唤了j只鸟剩余的mana值,    只要大于等于0即表示该状态可达,用背包问题求解dp即可*/#include 
#include
#include
using namespace std;typedef long long LL;LL dp[1010][10010],W,B,X,C=0;int n,cost[1010],c[1010];int main(){ memset(dp,0x80,sizeof(dp)); scanf("%d%lld%lld%lld",&n,&W,&B,&X); dp[0][0]=W; for(int i=1;i<=n;i++)scanf("%d",&c[i]),C+=c[i]; for(int i=1;i<=n;i++)scanf("%d",&cost[i]); for(int i=1;i<=n;i++){ for(int j=0;j<=C;j++){ LL nw=dp[i-1][j]; if(nw<0)continue; for(LL k=0;k<=c[i]&&k*cost[i]<=nw;k++)dp[i][j+k]=max(dp[i][j+k],nw-k*cost[i]); } for(int j=0;j<=C;j++)dp[i][j]=min(dp[i][j]+X,B*j+W); } for(int i=C;i>=0;i--)if(dp[n][i]>=0){ printf("%d\n",i); return 0; }}

F - Divisibility

/*    题目大意:给出n和k,要求找出数字大小在n以内的非重集合,使得集合中存在恰好k对a和b,    满足a能整除b    题解:我们先用nlogn的时间预处理出每个数被其小的数整除的次数di,    我们可以通过均摊logn的单次复杂度计算出一个数被比其大的数整除的次数,    那么我们就能比较快地得到一个数对于答案的影响    我们先随意去除一些di大于1的数,然后用较小的碎块去凑k这个整数,    如果无法凑出来,则不可行*/#include 
#include
using namespace std;const int N=300010;int n,k,d[N],b[N],tot=0,ans=0;int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ b[i]=1; for(int j=i+i;j<=n;j+=i)d[j]++,tot++; } for(int i=n;i>1;i--){ int s=d[i]; for(int j=i+i;j<=n;j+=i)if(b[j])s++; if(tot-s>=k&&d[i]>1){ tot-=s; b[i]=0; for(int j=i+i;j<=n;j+=i)d[j]--; } } for(int i=n;i>=1;i--){ int s=d[i]; for(int j=i+i;j<=n;j+=i)if(b[j])s++; if(tot-s>=k&&b[i]){ tot-=s; b[i]=0; for(int j=i+i;j<=n;j+=i)d[j]--; } } for(int i=1;i<=n;i++)ans+=b[i]; if(tot!=k){puts("No");return 0;} puts("Yes"); printf("%d\n",ans); for(int i=1;i<=n;i++)if(b[i])printf("%d ",i); return 0;}

转载于:https://www.cnblogs.com/forever97/p/codeforces461.html

你可能感兴趣的文章
返回顶部(动画)
查看>>
webpack+react+antd 单页面应用实例
查看>>
Confluence 6 SQL Server 数据库驱动修改
查看>>
Confluence 6 通过 SSL 或 HTTPS 运行 - 备注和问题解决
查看>>
【47.76%】【Round #380B】Spotlights
查看>>
Git(使用码云)
查看>>
分享Java web 开发必游之路
查看>>
IIS初始化(预加载),解决第一次访问慢,程序池被回收问题(转载)
查看>>
Bean的Scope
查看>>
【BZOJ】3142: [Hnoi2013]数列
查看>>
http初探
查看>>
elasticsearch的安装
查看>>
__next__()
查看>>
爬取:中国大学排名
查看>>
聊天室(C++客户端+Pyhton服务器)_1.框架搭设
查看>>
UpdatePanel 内控件 更新“外的”控件【转】
查看>>
mybatis中&gt;=和&lt;=的实现方式
查看>>
Python面向对象03/继承
查看>>
java序列化和反序列化
查看>>
绝对定位
查看>>