Codeforces Round #678 (Div. 2)

A. Reorder

题意:有一个有 n 个数的序列 a ,以及一个数 m ,问能否给序列a重新排序,能够满足式子 $\sum_{i=1}^{n}\sum_{j=1}^{n}\frac{a_{j}}{j}=m$。

思路:稍微计算一下便可以发现$1\times \frac{a_{1}}{1}+2\times \frac{a_{2}}{2}+...+n\times \frac{a_{n}}{n}=a_{1}+a_{2}+...+a_{n}$,其实这道题就是问序列的所有数之和是否为m。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. ios::sync_with_stdio(false);
  6. cin.tie(0);cout.tie(0);
  7. int t;
  8. cin>>t;
  9. while(t--){
  10. int n,m,ans=0,get_num;
  11. cin>>n>>m;
  12. while(n--){
  13. cin>>get_num;
  14. ans+=get_num;
  15. }
  16. if(ans==m) cout<<"YES"<<endl;
  17. else cout<<"NO"<<endl;
  18. }
  19. return 0;
  20. }

B. Prime Square

题意:t 组数据,每组数据给一个 n ,构造一个以 n 为边长的数字方阵,要求每个数都不能是质数,但是每行每列之和都为质数。

思路:构造,对于每一个 n ,可以考虑从 n 开始往上找质数,每找到一个质数 p 尝试构造一次,构造方法为主对角线元素为$p-n+1$,其余位置上的元素均为1,这样如果$p-n+1$不是质数,那就可以保证满足题意。(因为每个$p-n+1$都在主对角线上,所以每个$p-n+1$只对当前行列造成影响,所以这样构造可以保证每一行每一列的和都为我们找到的质数 p )。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. bool is_prime(int n){
  4. if(n==1) return false;
  5. for(int i=2;i*i<=n;i++){
  6. if(n%i==0) return false;
  7. }
  8. return true;
  9. }
  10. int main()
  11. {
  12. ios::sync_with_stdio(false);
  13. cin.tie(0);cout.tie(0);
  14. int t,n;
  15. cin>>t;
  16. while(t--){
  17. cin>>n;
  18. int p=n;
  19. while(!(is_prime(p) && !is_prime(p-n+1))) p++;
  20. for(int i=1;i<=n;i++){
  21. for(int j=1;j<=n;j++){
  22. if(i==j) cout<<p-n+1<<" ";
  23. else cout<<1<<" ";
  24. }
  25. cout<<endl;
  26. }
  27. cout<<endl;
  28. }
  29. return 0;
  30. }

C. Binary Search

题意:有一个序列有 n 个数,如果序列有序,则按照如下代码可以找到 pos 位置上的数字 x ,现在询问如果序列无序,而且仍然可以用下面这段代码找到位于pos 位置上的数字 x ,请问这样的序列有多少种,答案对1e9+7取模。

思路:按照代码我们可以得知,算至pos的路径是固定的,而且对于每次循环 left 和 right 所产生的 middle ,我们都可以用来确定 a[middle] 和 x 的大小关系,那么我们就可以确定某些位置的数字是严格大于 x 的,某些位置的数字是严格小于 x 的,这样我们就可以用全排列和乘法原理算出答案。

我们可以来进行二分,当 middle > pos 时,a[middle]是大于 x 的 , 大于 x 的计数变量加一;当middle < pos 时,a[middle]是小于 x 的,小于x的计数变量加一;二分完成后,会剩下$n-big-small$个位置上的数无法确定。所以答案就是从$n-x$个大于 x 的数选 big 个数的全排列乘以从$x-1$个小于 x 的数选 small 个数的全排列乘以剩下$n-big-small-1$个数的全排列,即$A_{n-x}^{big}\times A_{x-1}^{small}\times A_{n-big-small}^{n-big-small}$。当然,如果big>n-x或者small>x-1的话,不存在这样的排列,答案为0。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll mod=1e9+7;
  5.  
  6. int main()
  7. {
  8. ios::sync_with_stdio(false);
  9. cin.tie(0);cout.tie(0);
  10. long long n,x,pos,l,r,big=0,small=0,ans=1;
  11. cin>>n>>x>>pos;
  12. l=0;r=n;
  13. while(l<r){
  14. long long mid=(l+r)/2;
  15. if(mid==pos){
  16. l=mid+1;
  17. }else if(mid>pos){
  18. r=mid;
  19. big++;
  20. }else if(mid<pos){
  21. l=mid+1;
  22. small++;
  23. }
  24. }
  25. if(small>=x || big>n-x){
  26. cout<<0<<endl;
  27. }else{
  28. for(ll i=x-1,j=1;j<=small;i--,j++){
  29. ans=(ans*i)%mod;
  30. }
  31. for(ll i=n-x,j=1;j<=big;i--,j++){
  32. ans=(ans*i)%mod;
  33. }
  34. for(ll i=1;i<=n-small-big-1;i++){
  35. ans=(ans*i)%mod;
  36. }
  37. cout<<ans<<endl;
  38. }
  39. return 0;
  40. }

D. Bandit in a City

题意:城市有 n 个区域编号为1...n,n-1 个单向通路,而且1号区域为主区域,保证主区域可以到达任何其它区域。现在给出 i 号区域有 ai 个人,且一伙土匪位于主区域,他们希望抓住更多的人,他们会一只往前走,直至最后的区域没有通往其它区域的路,市民则可以选择通路进行逃跑,当没有通往其它区域的路且土匪位于该区域时市民会被抓住。现在土匪想要抓住尽可能多的人,而市民则希望尽可能少的人被抓住,两方都采取最优解。问土匪最多能抓到多少人。

思路:对于某一个区域,我们考虑当前区域时,土匪最多能抓多少人 ,那么这个问题依赖于该区域可以通往的其它区域所计算的结果。所以这个问题我们可以拆成一个一个的子问题然后用递归的思想来解决。对于任意一个区域 x ,我们需要算出这个当前区域以及这个区域能达到的区域的总人数num,当前区域之后的分支线路数lu,以及人数最多的那条路的人数maxx(这个maxx是考虑到位于尾节点的人无法逃跑),将这三个值放入一个结构体中递归时返回。

举个例子,对于上图这个例子考虑节点1就需要节点2和节点3的值,2需要4的值,3需要5和6的值。对于4节点{num=8,lu=1,maxx=8},对于5节点{num=15,lu=1,maxx=15},对于6节点{num=6,lu=1,maxx=6},对于3节点,这时我们计算的{num=当前节点的人数+所有子问题返回的人数 num 之和,lu=所有子问题返回的路数 lu 之和,maxx=max( maxx,刚算出的总人数num/刚算出的路数lu+(1) ) } (括号内的1分情况讨论,若num整除lu则不加,不整除则加),所以3节点{num=15+6+5=26,lu=1+1=2,maxx=max(15,26/2=13)=15}。对于2节点{num=12+8=20,lu=0+1,maxx=(0,20/1)=20},对于节点1{num=20+26+7=52,lu=1+2=3,maxx=max(20,15,52/3+1)=20}所以最后答案为20。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. vector<vector<int> >ro(200005);
  5. ll num[200005];
  6. struct node{
  7. ll lu,sum,maxx;
  8. }now,get_solve;
  9. node solve(int root){
  10. //cout<<"cont "<<root<<endl;
  11. if(ro[root].size()==0){
  12. now.lu=1;now.sum=num[root];now.maxx=num[root];
  13. return now;
  14. }
  15. ll lu=0,sum=num[root],maxx=0,mark=0;
  16. for(int i=0;i<ro[root].size();i++){
  17. get_solve=solve(ro[root][i]);
  18. lu+=get_solve.lu;
  19. sum+=get_solve.sum;
  20. maxx=max(get_solve.maxx,maxx);
  21. }
  22. now.lu=lu;now.sum=sum;
  23. if(sum%lu!=0) mark++;
  24. now.maxx=max(maxx,sum/lu+mark);
  25. return now;
  26. }
  27. int main()
  28. {
  29. ios::sync_with_stdio(false);
  30. cin.tie(0);cout.tie(0);
  31. int n,get_num,mark=0;
  32. cin>>n;
  33. for(int i=2;i<=n;i++){
  34. cin>>get_num;
  35. ro[get_num].push_back(i);
  36. }
  37. for(int i=1;i<=n;i++){
  38. cin>>num[i];
  39. }
  40. node ans=solve(1);
  41. if(ans.sum%ans.lu!=0) mark++;
  42. cout<<max(ans.maxx,ans.sum/ans.lu+mark)<<endl;
  43. return 0;
  44. }

Codeforces Round #678 (Div. 2)的更多相关文章

  1. Codeforces Round #678 (Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1436 A. Reorder 题解 模拟一下这个二重循环发现每个位置数最终都只加了一次. 代码 #include <bi ...

  2. Codeforces Round #678 (Div. 2) C. Binary Search (二分,组合数)

    题意:有长度\(n\)的序列,让你构造序列,使得二分查找能在\(pos\)位置找到值\(x\).问最多能构造出多少种排列? 题解:题目给出的\(pos\)是固定的,所以我们可以根据图中所给的代码来进行 ...

  3. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  4. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  5. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  6. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  7. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  8. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  9. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

随机推荐

  1. matlab中如何定义函数

    首先建立M文件或直接点击(File/New/Function)建立函数文件,其中函数文件的格式是: function [输出变量] = 函数名称(输入变量) % 注释 % 函数体 如下所示,是编写的一 ...

  2. thinkPHP5.1 MVC架构使用方法

    MVC架构 1.M层:model(模型),是增强版的数据库 M层是用来存放自动完成代码.修改器(数据修改).模型事件.验证器 2.V层:view 显示视图 V层用来存放HTML.css.JavaScr ...

  3. Oracle学习(十七)数据库锁在分布式系统里的应用(老板,乐观锁了解一下?~)

    一.引言 随着业务量的增加,单机部署已经无法满足日常需求了,我们可能会把代码部署到多台服务器上去来进行服务的扩容,也就是负载均衡,那在这种场景下,怎么能实现锁的概念呢? 那么我们知道如果是一台主机部署 ...

  4. 数据库图形表Navicat Premium

    1.什么是数据库? 存储数据,为了方便查询和使用 web时代使用最广泛的关系型数据库 2.历史: 瑞典公司开发,卖给SUN,SUN又卖给ORACLE 开源,免费,支持多平台 3.数据库图形表Navic ...

  5. C++实现职工管理系统(中)

    C++实现职工管理系统(中) 大家好,今天是在博客园的第九天,博主今天给大家带来的是职工管理系统(C++)(中) 这次的随笔记录是实现(上)结语处说的几个功能 目录 C++实现职工管理系统(中) 1. ...

  6. Centos-分割文件-split

    split 分割文件,将一个文件分割为多个 相关选项 -b 指定文件大小,可以在size后面添加单位后缀,b表示512字节,k表示1KB,m表示MB -n 指定分割文件的长度,默认为1000行 -d ...

  7. Oracle 11G RAC11.2.0.4 + Redhat7.3安装手册

    安装思路: 1.安装两台redhat7 linux系统 2.网络配置(双网卡,public,vip,private,scan) 3.存储配置(内存配置,ASM共享存储:6块5G共享盘udev,根目录留 ...

  8. Python练习题 003:完全平方数

    [Python练习题 003]一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? --------------------------------------- ...

  9. spring-boot-route(三)实现多文件上传

    Spring Boot默认上传的单个文件大小1MB,一次上传的总文件大小为10MB. 单个文件上传使用MultipartFile参数来接收文件,多文件使用MultipartFile[]数组来接收,然后 ...

  10. 井字棋小游戏(C语言)

    最近沉迷于<NetHack>.<DCSS>等字符游戏,对其很感兴趣,于是用C语言写了个字符界面的井字棋小游戏.欢迎大家指教. 编写时遇到了一些问题,我原先准备用循环,直到读取到 ...