NOIP2011提高组day2

NOIP 2011 提高组 Day 2

T1 :

题意:

         这道题题意很显然,方法就是利用数学中的二项式定理 : ( x + y ) ^ n = C ( i , n ) * x ^ i * y ^ ( n - i ),i ∈ [ 0 , n ],所以求x ^ n * y ^ m的系数,就是求C( n , k ) * a ^ n * b ^ m再模上10007,注意求C( n , k ) % mod时要求逆元。

代码:

 

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;const int mod = 10007;long long fac, vfac, vvfac, facc, M;
long long a, b, k, n, m;long long exgcd(long long a1, long long b1, long long &x, long long &y) {if (b1 == 0) {x = 1;y = 0;return b1;} else {long long x0, y0;long long dd = exgcd(b1, a1 % b1, x0, y0);x = y0;y = x0 - (a1 / b1) * y0;return dd;}
}long long rv(long long i, long long mo) {long long x, y;exgcd(i, mo, x, y);return (x % mo + mo) % mo;
}int main() {freopen("factor.in", "r", stdin);freopen("factor.out", "w", stdout);scanf("%I64d%I64d%I64d%I64d%I64d", &a, &b, &k, &n, &m);fac = 1;facc = 1;M = 1;for (int i = 1; i <= k; i++) M = M * i % mod;for (int i = 1; i <= n; i++) fac = fac * i % mod;for (int i = 1; i <= m; i++) facc = facc * i % mod;vfac = rv(fac, mod);vvfac = rv(facc, mod);long long w = (M % mod * vfac % mod * vvfac % mod) % mod;long long l = 1, r = 1;for (int i = 1; i <= n; i++) l = l * a % mod;for (int i = 1; i <= m; i++) r = r * b % mod;printf("%I64d\n", (l % mod * r % mod * w % mod) % mod);return 0;
}
View Code

 

T2 :

题意:

        不难想到这道题求W要用到二分答案,二分的条件也不难想,注意求L到R中有多少个满足W[ i ] >= W的时候可以借助前缀和。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;const int N = 200001;const long long INF = 1e15 + 1;long long n, m, S, ans = INF, Y;
long long w[N], v[N], ll[N], rr[N], sum[N], cnt[N];bool check(long long x) {memset(sum, 0, sizeof(sum));memset(cnt, 0, sizeof(cnt));Y = 0;for (int i = 1; i <= n; i++) {if (w[i] >= x) sum[i] = sum[i - 1] + v[i], cnt[i] = cnt[i - 1] + 1;else sum[i] = sum[i - 1], cnt[i] = cnt[i - 1];}for (int i = 1; i <= m; i++)Y += (cnt[rr[i]] - cnt[ll[i] - 1]) * (sum[rr[i]] - sum[ll[i] - 1]);if (abs(Y - S) <= ans) {ans = abs(Y - S);return true;}return false;
}int main() {freopen("qc.in", "r", stdin);freopen("qc.out", "w", stdout);scanf("%I64d%I64d%I64d", &n, &m, &S);long long ma = -1;for (int i = 1; i <= n; i++) {scanf("%I64d%I64d", &w[i], &v[i]);if (w[i] > ma) ma = w[i];}for (int i = 1; i <= m; i++) scanf("%I64d%I64d", &ll[i], &rr[i]);long long lf = 0, rg = ma;while (lf != rg) {long long mid = (lf + rg) >> 1;if (check(mid) && Y <= S) rg = mid;if (check(mid) && Y > S) lf = mid + 1;if (!check(mid) && Y <= S) rg = mid;if (!check(mid) && Y > S) lf = mid + 1;}int mid = (lf + rg) >> 1;check(mid);printf("%I64d\n", ans);return 0;
}
View Code

T3 :

题意:

          这道题要求的是乘客的总旅行时间最短,不难想到要让每一个乘客旅行时间都最短,所以我们想到可以用贪心算法来求解,所以现在的问题是,我们要怎么使用这些氮气瓶?我们应该给哪些段加速?

        首先,如果有这样的一段路,观光车比下一个站点最晚到的一个人还要到得晚,很显然我们该使用加速器了;其次,如果有很多段这样的路段,我们便选择对结果影响最大的一段,就是在下一站下车人数最多的那一段,这样一直找下去,直到氮气用尽或者是不存在这样的路段。

需要用到的数组:

latest[ i ]:站点i乘客最晚到的时间;

arrive[ i ]:观光车最晚到i站点的时间;

next[ i ]:离第i个站点最近的站点满足latest[ i ] >= arrive[ i ](意思就是说从i到next[ i ] - 1的路段都满足观光车到得比游客晚);

sum[ i ]:前i个站中下车的人数;

这是网上找的有批注版的,便于理解:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,k;
int Di[1005];
int t[10005],a[10005],b[10005];
int arrive[1005],latest[1005];
int sum[1005],next[1005];
int minn,sta;
int ans;
int maxl;
int main()
{freopen("bus.in","r",stdin);freopen("bus.out","w",stdout);scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n-1;i++)scanf("%d",&Di[i]);for(int i=1;i<=m;i++){scanf("%d%d%d",&t[i],&a[i],&b[i]);sum[b[i]]++;if(t[i]>latest[a[i]])latest[a[i]]=t[i];}//前缀累加和for(int i=2;i<=n;i++)sum[i]+=sum[i-1];while(1){//每次更新距离后(用了加速器)都要更新arrive[] arrive[1]=0;for(int i=2;i<=n;i++)arrive[i]=max(arrive[i-1],latest[i-1])+Di[i-1];//且要更新next[],因为用了加速器后,有些点是不满足区间条件next[n]=n;for(int i=n-1;i>=1;i--){//满足条件区间连续  1(*)  2  3(*) 4(*)  5(*) 6  7(*) 8 // 3---next[3]-1  3      6  6      6       6    8   8     8                             next[i]=next[i+1];if(arrive[i+1]<=latest[i+1])//第i+1个点不满足next[i]=i+1;}//贪心需找区间maxl=1;while(!Di[maxl]&&maxl<=n-1)++maxl;if(maxl==n||k==0)break;//寻找最优区间//i+1--next[i]-1,sum[next[i]]-sum[i]=i+1--for(int i=maxl+1;i<=n-1;i++)if(Di[i]&&sum[next[maxl]]-sum[maxl]<sum[next[i]]-sum[i])maxl=i;if(sum[next[maxl]]-sum[maxl]==0)break;//后面已无乘客int dd=100005;for(int i=maxl+1;i<=next[maxl]-1;i++)dd=min(dd,arrive[i]-latest[i]);//最小时间差,乘客先到,汽车后到dd=min(dd,k);//这段区间中使用加速器,所有乘客都受益,所以不存在人数最多相同区间dd=min(dd,Di[maxl]);k-=dd;//区间没人都受益,受益总和确定Di[maxl]-=dd;} //此时所以bus都比乘客先到达 for(int i=1;i<=m;i++)ans+=abs(arrive[b[i]]-t[i]);//防止没有加速器 ,可能为负cout<<ans<<endl;return 0;
}
View Code

这是自己写的:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;const int N = 10001;int t[N], a[N], b[N], latest[N], arrive[N], d[N], next[N], sum[N];
int n, m, k, ans;int main() {freopen("bus.in", "r", stdin);freopen("bus.out", "w", stdout);scanf("%d%d%d", &n, &m, &k);for (int i = 1; i <= n - 1; i++) scanf("%d", &d[i]);for (int i = 1; i <= m; i++) {scanf("%d%d%d", &t[i], &a[i], &b[i]);if (t[i] > latest[a[i]]) latest[a[i]] = t[i];sum[b[i]]++;}for (int i = 1; i <= n; i++) sum[i] += sum[i - 1];while (1) {int maxl = 1;arrive[1] = 0;for (int i = 2; i <= n; i++)arrive[i] = max(arrive[i - 1], latest[i - 1]) + d[i - 1];next[n] = n;for (int i = n - 1; i; i--) {next[i] = next[i + 1];if (arrive[i + 1] <= latest[i + 1]) next[i] = i + 1;}while (!d[maxl] && maxl <= n - 1) maxl++;if (maxl == n || k == 0) break;for (int i = maxl + 1; i <= n - 1; i++)if (d[i] && sum[next[maxl]] - sum[maxl] < sum[next[i]] - sum[i]) maxl = i;if (sum[next[maxl]] - sum[maxl] == 0) break;int least = 1e8 + 7;for (int i = maxl + 1; i <= next[maxl] - 1; i++)least = min(least, arrive[i] - latest[i]);least = min(least, k);least = min(least, d[maxl]);k -= least;d[maxl] -= least;}for (int i = 1; i <= m; i++) ans += (arrive[b[i]] - t[i]);printf("%d", ans);return 0;
}
View Code

 

转载于:https://www.cnblogs.com/ganster/p/8833209.html

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

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

相关文章

react+redux+node报错Tapable.plugin is deprecated. Use new API on `.h ooks` instead

npm run hot运行 报错(node:5372) DeprecationWarning: Tapable.plugin is deprecated. Use new API on .h ooks instead 原因是内网的IP变了&#xff0c;所以启动报错&#xff0c;修改webpack.dev.js里的host&#xff0c;解决。

什么是单点登录

前言&#xff1a; 是时候了解一下SSO相关的知识了&#xff0c;本篇主要是概念篇&#xff0c;发现网上两篇不错的文章&#xff0c;简单整合了一下&#xff0c;原文链接&#xff1a;https://www.cnblogs.com/Java3y/p/10877465.htmlhttps://www.cnblogs.com/EzrealLiu/p/5559255.…

支付宝H5支付,ISV权限不足

报错如下&#xff1a; 登录支付宝商户平台&#xff0c;发现签约产品已失效&#xff1a; 重新申请&#xff0c;修改网址之后就成功了&#xff1a;

我们为何需要单点登录系统

SSO&#xff0c;Single Sign On&#xff0c;也就是单点登录&#xff0c;保证一个账户在多个系统上实现单一用户的登录 现在随着网站的壮大&#xff0c;很多服务会进行拆分&#xff0c;会做SOA服务&#xff0c;会使用dubbo做微服务&#xff0c;或者简单的小型分布式&#xff0c…

微信JSAPI支付,报错当前页面的URL未注册

调用微信统一支付的接口&#xff0c;支付时报错&#xff1a; 解决方案&#xff1a; 打开微信商户平台&#xff0c;将当前页面的URL配置到JSAPI域名。

借助xxl-sso实现SSO

前言 市场上一下主流的SSO技术搭配方案&#xff1a; SpringSecurity OAuth2 SpringSecurity CAS 功能较弱&#xff0c;对前后端分离的项目支持不是很好Shiro CAS JWT 可以自定义需求&#xff0c;灵活扩展鉴权方式 本篇主要是单点登录&#xff0c;不涉及鉴权&#xff0c;后面…

C语言数组初始化的问题

转载于:https://www.cnblogs.com/chulin/p/8880184.html

blocked by CORS policy,是否跨域?

经排查不是跨域的问题&#xff0c;代码报错&#xff0c;改好就解决了 2021.10.20 项目上线又报错&#xff0c;测试环境一直没问题&#xff0c;上线了就报这个错&#xff0c;如果是前端代码的问题&#xff0c;那么使用测试接口的时候肯定也会报这个错&#xff0c;所以排除前端代…

那些一眼就被看出包装过的简历

本文作者&#xff1a;Coody原文链接&#xff1a;https://my.oschina.net/hooker/blog/3014656 前言 在互联网极速膨胀的社会背景下&#xff0c;各行各业涌入互联网的IT民工日益增大。 早在2016年&#xff0c;我司发布了Java、Ios工程师的招聘信息&#xff0c;就Java工程师单个岗…

sql 查询优化小计

好久没更博了&#xff0c;偷偷的抽时间写一下。 早上开始working的时候&#xff0c;发现一个页面加载很慢&#xff0c;经排查是昨天写的一条联合查询的sql导致的。于是着手优化&#xff01; 首先想到的是在join的时候&#xff0c;减少表体积之后再进行关联&#xff0c;于是有了…

微信支付宝扫一扫进入小程序的相关配置

需求: 微信小程序和支付宝小程序,用微信和支付宝扫同一个普通二维码,支付宝扫码进入支付宝小程序指定页面,微信扫码进入微信小程序的指定页面。解决办法: 微信公众平台和支付宝开放平台都有自己的二维码配置规则。配置相同的规则,然后用配置的二维码地址加上参数,用草料…

重温Elasticsearch

什么是 Elasticsearch &#xff1f; Elasticsearch (ES) 是一个基于 Lucene 构建的开源、分布式、RESTful 接口全文搜索引擎。还是一个分布式文档数据库&#xff0c;其中每个字段均是被索引的数据且可被搜索&#xff0c;它能够扩展至数以百计的服务器存储以及处理PB级的数据。它…

unity之中级工程师

主要是实际操作。 Destroy(游戏对象)&#xff1a;会真正销毁游戏对象。 动态链接库 热更新&#xff1a;用户不需要更新整个项目&#xff0c;只需要更新需要更新的部分&#xff0c;使用AssetBundle。PC,Android可以使用逻辑热更新&#xff0c;将脚本利用反射打包成一个动态链接库…

芝麻信用综合评估未通过,请选择商户支持的其他方式使用服务

如题&#xff1a;公司小程序发布上线的时候报这个错&#xff0c;因为在测试接口的时候都是可用的&#xff0c;发布上线之后不行了&#xff0c;官方的案例及解决方案地址是&#xff1a;点击链接 给出的大致原因如下&#xff1a; 因为在测试接口时能正常使用&#xff0c;所以排除…

elasticsearch集群搭建-windows

1、下载elasticsearch到本地并解压 下载地址&#xff1a; https://www.elastic.co/cn/downloads/elasticsearch 解压之后复制两份&#xff0c;node1当作主节点&#xff0c;node2、node3当作从节点 2、修改主节点配置文件 而我们只需要修改 /config 目录下的 elasticsearch.yml …

vue如何新建一个项目(超详细哦--转)

原文链接 vue创建项目&#xff08;npm安装→初始化项目&#xff09; 第一步npm安装 首先&#xff1a;先从nodejs.org中下载nodejs 双击安装&#xff0c;在安装界面一直Next 直到Finish完成安装。 打开控制命令行程序&#xff08;CMD&#xff09;,检查是否正常 使用淘宝NPM …

传统ELK分布式日志收集的缺点?

传统ELK图示&#xff1a; 单纯使用ElK实现分布式日志收集缺点&#xff1f; 1、logstash太多了&#xff0c;扩展不好。 如上图这种形式就是一个 tomcat 对应一个 logstash&#xff0c;新增一个节点就得同样的拥有 logstash&#xff0c;可以说很浪费了。 2、读取IO文件&#xff0…

微信支付分开发流程

公司要用支付分信用免押功能&#xff0c;于是着手开发。 首先要与微信的技术人员对接&#xff0c;申请支付分功能&#xff0c;申请成功之后&#xff0c;会给商户发送服务ID&#xff1b;等1到3个工作日内自行登录商户平台查看是否有开通成功&#xff0c;如果3个工作日依旧没有支…

运行银联支付系统demo

1、Demo下载 下载地址&#xff1a;https://open.unionpay.com/tjweb/acproduct/list?apiservId448 2、导入项目 注意&#xff1a;非maven项目&#xff0c;在导入idea、或者eclipse时请留意导入方式 3、修改配置 acp_sdk.properties 将backUrl、frontUrl修改为外网可访问的路径…