Codeforces Round #587 (Div. 3)

A

只要每两个都不一样就可以,一旦出现两个一样的就改一个。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=2e5+5;
int n,ans;
char s[MAXN];int main()
{while(~scanf("%d",&n)){ans=0;scanf("%s",s);for(int i=0;i<n;i+=2){if(s[i]=='a'){if(s[i+1]=='a'){s[i+1]='b';ans++;}}else{if(s[i+1]=='b'){s[i+1]='a';ans++;}}}printf("%d\n%s\n",ans,s);}return 0;
}

B
就是一个排序

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e3+5;struct node
{int idx,p;
}a[MAXN];
int n;
int ans;bool cmp(const node&a,const node&b)
{return a.p>b.p;
}int main()
{while(~scanf("%d",&n)){ans=0;for(int i=1;i<=n;i++){a[i].idx=i;scanf("%d",&a[i].p);}sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){ans+=(i-1)*a[i].p+1;}printf("%d\n",ans);for(int i=1;i<n;i++){printf("%d ",a[i].idx);}printf("%d\n",a[n].idx);}return 0;
}

C

题目的意思很好理解,就是有点小繁琐。就是一张白纸两张黑纸,问黑纸会不会把白纸完全盖住。
这个问题我们不能直接暴力进行判断,我们首先要进行分析。
盖不住的情况有很多种,但是盖住的情况是可以分析的。如果一张黑纸直接将白纸全部盖住(四个角都盖住),那就没什么好说的了。
如果存在一个角没有被任何黑纸盖住,显然白纸是可以从上面看到的。
如果四个角都被黑纸盖住了,我们首先分析,每张黑纸只能盖住1,2,4个角,显然不能只盖住3个角。盖住四个角的我们已经判断过了,其中盖住一个角还能保证四个角都被黑纸盖住就说明另一张黑纸全部盖住了,如果不是全部盖住就是有角没有盖住,我们已经判断过了,那么剩下的只能是两张黑纸每张各占两个角,而且还是相对的两个角。
那么判断能否被覆盖的条件就很明了了:如果相对的这两张黑纸有交集(或者恰好拼在一起)就是可以盖住的,否则就是盖不住的。
分别进行判断。觉得可能是自己写复杂了。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;struct node
{int x,y;
}a[4];
int vis[4];int x1,x2,y1,y2;
int x3,x4,y3,y4;
int x5,x6,y5,y6;int main()
{while(~scanf("%d%d%d%d%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4,&x5,&y5,&x6,&y6)){if(x1>=x3 && y1>=y3 && x2<=x4 && y2<=y4 || x1>=x5 && y1>=y5 && x2<=x6 && y2<=y6){printf("NO\n");continue;}a[0].x=x1; a[0].y=y1;a[1].x=x1; a[1].y=y2;a[2].x=x2; a[2].y=y1;a[3].x=x2; a[3].y=y2;memset(vis,0,sizeof(vis));for(int i=0;i<4;i++){if(a[i].x>=x3 && a[i].y>=y3 && a[i].x<=x4 && a[i].y<=y4){vis[i]=1;}}for(int i=0;i<4;i++){if(a[i].x>=x5 && a[i].y>=y5 && a[i].x<=x6 && a[i].y<=y6){vis[i]=2;}}bool flag=true;for(int i=0;i<4;i++){if(!vis[i]){flag=false;break;}}if(!flag){printf("YES\n");}else{bool ok=false;if(vis[1]==vis[3]){if(vis[1]==1){if(y6>=y3)ok=true;}else{if(y4>=y5)ok=true;}}else{if(vis[1]==1){if(x4>=x5)ok=true;}else{if(x6>=x3)ok=true;}}if(ok){printf("NO\n");}else{printf("YES\n");}}}return 0;
}

D
我们用剩下最多的剑减去其他剩下的剑就可以得到至少拿走了多少剑。得到一个数列a1,a2,a3…an,这个数列里面肯定有一个是0,我们知道有一个结果肯定是t=gcd(a1,a2,a3…an),ans=a1/t+a2/t+a3/t+…+an/t。但是这个结果是不是最好的就不好说了,人家还可以每一个都多拿了一些,设为x,那么t=gcd(a1+x,a2+x,a3+x,…an+x),ans=(a1+x)/t+(a2+x)/t+…+(an+x)/t。x>=0。我们就在这些结果里面找最优解。
我们对这个结果进行观察,结合最大公因数的一个式子:gcd(a,b)=gcd(a,a-b),设mina=min(a1+x,a2+x,…,an+x),那么t=gcd(a1+x-mina,a2+x-mina,…an+x-mina),这就退化成了最开始的情形,所以说,最开始的情形是最优解。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cctype>
#include<queue>
#include<set>using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=2e5+5;int n;
ll ans;
int a[MAXN],maxa;ll gcd(ll a,ll b)
{return b==0?a:gcd(b,a%b);
}int main()
{while(~scanf("%d",&n)){maxa=0; ans=0;for(int i=0;i<n;i++){scanf("%d",&a[i]);if(a[i]>maxa) maxa=a[i];}for(int i=0;i<n;i++){a[i]=maxa-a[i];}ll tmp=0;for(int i=0;i<n;i++){tmp=gcd(a[i],tmp);}for(int i=0;i<n;i++){ans+=a[i]/tmp;}printf("%lld %lld\n",ans,tmp);}return 0;
}

后面的三道题还没有做出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信道分配 以太网

1.频分复用 将信道分为多个频带, 用户得到某个频带后,在通信的过程中, 自始至终都都占用这个信道.即频分复用中, 所有用户同时占用不同频带的信道 2. 时分信道 将时间划分为一段一段的等长时分复用帧, 每个用户在不同时间占用相同的数据帧 3. CSMA/CD 载波监听多点接入/碰撞…

strpbrk函数

http://blog.csdn.net/tommy_wxie/article/details/7554332 函数原型&#xff1a;extern char *strpbrk(char *str1, char *str2) 参数说明&#xff1a;str1待比较的字符串&#xff0c;str2为指定被搜索的字符串。 所在库名&#xff1a;#include <string.h> …

网络层网络层服务及其 IP 地址

ARP 协议功能 将 IP 地址通过广播(一个网段, 不能跨路由器), 目标 MAC 地址是FFFFFFFF 解析目标IP地址的 MAC 地址. IP 协议 网络层的一个协议, 是一个协议的统称, 包括 ARP(地址解析协议) 协议, ICMP(网络控制报文协议) 协议, IGMP(网际组管理协议) 协议. 其中 ICMP 和 IG…

随机生成1024个数,存入一段内存,用指针实现获取1024个数的最大数地址,最小数地址

http://blog.csdn.net/itcastcpp//details/39277193 题目&#xff1a;随机生成1024个数&#xff0c;存入一段内存&#xff0c;用指针实现获取1024个数的最大数地址&#xff0c;最小数地址&#xff0c;具体实现如下&#xff1a; [cpp] view plaincopy #include<stdlib.h> …

UVa11134

【题目分析】 觉得是一道挺考验贪心掌握程度的题目&#xff0c;我就算知道是要用贪心而且肯定和区间有关&#xff0c;肯定要进行一下排序什么的我还是没有找到合适的贪心策略。 经过大佬的博客后我才明白如何进行贪心。 如果没有任何提示看这道题&#xff0c;首先&#xff0…

传输层:IP 地址解析 路由转发

IP 地址与硬件地址 1. 地址解析 通过IP地址将其如何转换为 MAC 地址.解决同一个局域网上的主机或路由的 IP 地址和硬件地址的映射问题. 即以太网上除了主机还有路由. 即如果发出的请求所有的主机都没有做出相应, 那么该以太网上的路由会对其做出响应. (1) 以太网内部主机与…

UVa11582

一个数学问题,一旦出现循环确定循环节以后就能解决问题啦. 加上一个快速幂取模.需要注意的是数据范围是264,所以必须用unsigned long long才能解决问题. 觉得板子还是要会自己写,否则不同的题目具体有一些小的改变就会束手无策. 还有就是发现如果每次初始化数组的话就会超时,所…

输入一个单向链表,输出该链表中倒数第K个结点

http://blog.csdn.net/itcastcpp/article/details/39274891//尹成 单链表操作 #include <iostream> using namespace std; class LinkList;struct LinkNode { public:LinkNode(int value 0):m_value(value),pNext(NULL){}~LinkNode(){pNext NULL;}friend class LinkList…

网络层:构成超网(CIDR)

CIDR构成超网 CIDR消除了原来的传统的 A,B, C, D类地址, 使用了各种网络前缀来代替原来分类地址中的网络号和子网号, IP 地址由原来的三级分类又变成了两级分类. 其中网络号和子网号是一个随机的长度. 其中 CIDR 也可以使用 / 的形式来表示, 其中在 / 前面写上网络前缀的位数.…

UVa12169

我们可以暴力枚举a,然后通过x1和x3确定b的值&#xff0c;然后确定其他的数字&#xff0c;一旦出现错误就放弃这组解。 关键问题就在于如何通过a,x1,x3确定b的值 x2 ( x1 * a b) % M x3 ( x2 * a b ) % M ( ( x1 * a b ) % M * a b ) % M x3 - k * M x1 * a % M * a %…

尹成 双循环链表

今天&#xff0c;我们一起用C写一个双链表&#xff0c;具体代码如下&#xff1a; DoubleList.h具体内容如下&#xff1a; [cpp] view plaincopy #include "NodeList.h" template<typename Type> class DoublyList{ public: DoublyList() :head(ne…

堆的基本操作

堆的数据结构 对于堆, 有最大堆和最小堆, 在定义一个堆的时候用一个数组表示堆, 同时为了方便定义堆的大小, 用一个 size 表示堆的有效元素, 同时为了区别最大堆和最小堆, 我们用一个函数指针表示这个堆是最大堆还是最小堆. typedef int (*Compare)(HeapType parent, HeapTyp…

UVa1605

完完全全的构造题 一种比较好想到&#xff08;虽然我没有想到。。&#xff09;的方法是做成一个两层的表格&#xff0c;第一层每一行相同&#xff0c;第二层每一列相同&#xff0c;这样每个都能和其他的相邻了。 输出格式稍微注意一下 #include<cstdio> #include<c…

Linux下的TCP/IP编程----IO复用及IO复用服务端

http://blog.csdn.net/wqc_csdn/article/details/51583901 在之前我们实现的并发服务端时通过床将多个进程来实现的&#xff0c;这种并实现并发的方式简单方便&#xff0c;但是进程的创建和销毁是很消耗系统资源的&#xff0c;在访问量大时服务器很容易出现资源不够用的情况。除…

UVa120

相当于是一个模拟&#xff0c;为了得到合适的顺序&#xff0c;我们的策略是每次找到当前没有被翻的里面最大的&#xff0c;然后把他翻到最前面&#xff0c;然后再翻到合适的位置。 需要判断一下当前是否已经有序&#xff0c;有序就不用翻了。 如果在最开头找到了合适的当前应…

二叉树的相关操作

二叉树的数据结构 typedef char SearchTreeType; typedef struct SearchTreeNode { SearchTreeType key; // 关键码 struct SearchTreeNode* lchild; struct SearchTreeNode* rchild; } SearchTreeNode; 二叉树的初始化 由于我们是用一个指向根节点的指针表示一个二叉树, …

网络层:网关协议

一. 网关 所谓的网管即就是之前路由器的名字, 即路由器和网关是一个东西 二. 内部网关协议 1. RIP协议 路由信息协议 RIP 是内部网关协议 IGP中最先得到的广泛使用的协议. 同时 RIP 是一种分布式基于距离向量的路由选择协议. RIP 协议要求网络中的每一个路由都必须维护自己…

UVa1152

题意很好理解&#xff0c;就是从四个集合里面取出四个数字的和为0&#xff0c;问有多少种取法。 直接枚举肯定是会超时的&#xff0c;所以得想办法优化一下。我们可以将两个集合的所有的和都放在一个数组里面&#xff0c;这样得到两个数组&#xff0c;然后排序&#xff0c;对第…

Linux函数--inet_pton / inet_ntop

http://blog.csdn.net/lindyl/article/details/10427925 inet_pton 和 inet_ntop Linux下这2个IP地址转换函数&#xff0c;可以在将IP地址在“点分十进制”和“整数”之间转换而且&#xff0c;inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。算是比较新的函数了。 inet_pto…

网络基础: 浅析应用层一

应用层 1. http协议 在 http 中协议分为了协议方案名, 登录信息名, 服务器地址, 服务器端口号(http协议绑定的端口号), 文件类型, 查询的字符串, 片段标识位 2. http 请求协议格式 httpp 总共分为三大部分, 其中首行即就是第一部分, 分为三个区域, 第一去个区域是请方法, 第…