U41568 Agent1

题目背景

2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENEDRESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派Agent去参加这次的XM大战,与世界其他地方的ENLIGHTENED并肩作战。

题目描述

某地的ENLIGHTENED总部总部有N个Agent,每个Agent的能力值互不相同,现在ENLIGHTENED行动指挥想要派出A,B两队Agent去参加XM大战。但是参加大战的两个队伍要满足两个要求:

  1. A队中能力最大的Agent的能力值要小于B队能力最弱的Agent的能力值。
  2. A,B两队都要有人参战。

并不一定所有的Agent都要去参加XM大战的,心急的ENLIGHTENED行动指挥想知道有多少种安排Agent参加大战的方案。由于答案可能很大,所以只需要你求出答案模(109+7)的值就可以了。

输入输出格式

输入格式:

输入仅一行,为一个整数N。

输出格式:

输出答案模(109+7)的值。

输入输出样例

输入样例#1: 复制

3
输出样例#1: 复制

5
输入样例#2: 复制

6
输出样例#2: 复制

129

说明

对于20%的数据 N≤10

对于40%的数据 N≤103

对于60%的数据 N≤105

对于100%的数据 N≤109

背景影藏面目下的组合数学QAQ

也许我能推出来式子的组合式子就只能是$D1T1$水平了八QAQ

一开始找规律,发现要满足题目所给的条件,其实是分别在$n$个中找$2,3,4,5...n$个人的组合数方案在乘上$i-1$加起来。因为相当于要使小的连续一段在$A$,大的连续一段在$B$。

比如一共有5个人参赛,他们能力值就是$1、2、3、4、5$只能如下安排:

A B
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

只有(5-1)= 4种方法,再乘上$n$中选$5$个人的组合数。

得到公式:$ans=\sum_{i=2}^n{{C_n^i}*(i-1)}$,60分到手。

但是答案显然要$O(1)$得到($log$)。

发现每个单项式乘的$(i-1)$非常不美QAQ($zyl$dalao原话%%),所以把整个式子先加上一整个$\sum_{i=2}^n{C_n^i}$,$ans = \sum_{i=2}^n{C_n^i}-(2^n-1-n)$。

然后依然是$zyl$dalao以前传授的!

$i\sum_n^i = n\sum_{n-1}^{i-1}$,在n个人中选i个人组成一队,再在其中选择1个人作为队长的方案数等于现在n个人中选1个人当队长,再在剩下n-1个人中选i-1个人做组员的方案数。是唯一记得最清楚的组合方程了QAQ

所以$ans = n\sum_{i=2}^n{C_{n-1}^{i-1}}-(2^n-1-n)$,所以$ans=n(2^{n-1}-1)-(2^n-1-n)$。

结果交上去还wa了一次!QAQ取模啊取模姐姐!!

#include<bits/stdc++.h>
#define mod 1000000007
#define LL long long
using namespace std; LL n; LL mpow(LL a, LL b) {
LL ans = ;
for(; b; b >>= , a = a * a % mod)
if(b & ) ans = ans * a % mod;
return ans;
} int main() {
scanf("%lld", &n);
LL ans = ((n * mpow(, n - ) % mod - (mpow(, n) - )) % mod + mod) % mod;
printf("%lld", ans);
return ;
}

U41569 Portal1

题目背景

Agent获取资源有很多种方式,HACK就是其中的一中,侵入Portal可以获得很多有用的资源。ENLIGHTENED总部因为参加XM大战,只剩下一点点可用资源了,所以ENLIGHTENED行动指挥想要进行HACK活动,尽量增加库存。

题目描述

地图上有N个可以被HACKPortal,编号为1~N。HACK第ii号Portal需要时间T[i]秒,可以HACK出C[i]库存的资源。可是只有有能量的Portal才可以HACK出资源。第ii号Portal在第D[i]秒时,能量就会消失殆尽。ENLIGHTEDED想知道,最多可以增加多少库存,并且按编号小到大输出需要HACKPortal的编号。

输入输出格式

输入格式:

第一行输入一个整数N

下接N行每行3个整数,T[i],D[i],C[i]

输出格式:

输出第一行为一个整数,最多可以增加多少库存。

第二行为一个整数,代表需要HACK多少个Portal

第三行按编号小到大输出需要HACKPortal的编号,若有多种HACK的方案输出其中一种即可。

输入输出样例

输入样例#1: 复制

3
5 6 5
1 8 2
2 7 3
输出样例#1: 复制

7
2
1 2

说明

对于20%的数据N≤5,T[i],C[i]≤5,D[i]≤10

对于40%的数据N≤20,T[i],C[i]≤10,D[i]≤100

对于60%的数据N≤50,T[i],C[i]≤15,D[i]≤1000

对于100%的数据 N≤100,T[i],C[i]≤20,D[i]≤2000

哭哭,本来以为自己从后往前DP完全正确的!结果后面状态还没更新,前面就更新了,爆错。

正确是先背包预处理出到达每天能获得最大的值,同时顺便处理出每个物品在当前时间点可不可以取。

因为背包的时候是正着枚举物品,虽然可能会覆盖,但是最后倒着取物品,就可以保证最后得到的物品是最优了。

#include<bits/stdc++.h>
using namespace std; int n; struct Node {
int t, c, d, id;
} hack[];
bool cmp(Node a, Node b) { return a.d < b.d; } int dp[], vis[][], QAQ[];
int main() {
scanf("%d", &n);
for(int i = ; i <= n; i ++)
scanf("%d%d%d", &hack[i].t, &hack[i].d, &hack[i].c), hack[i].id = i;
sort(hack + , hack + + n, cmp);
for(int i = ; i <= n; i ++)
for(int j = hack[i].d-; j >= hack[i].t; j --) {
if(dp[j] < dp[j-hack[i].t] + hack[i].c) {
dp[j] = dp[j-hack[i].t] + hack[i].c;
vis[i][j] = ;
}
}
int ans = ;
for(int i = ; i <= hack[n].d; i ++) if(dp[ans] < dp[i]) ans = i;
printf("%d\n", dp[ans]);
for(int i = n; i >= ; i --)
if(vis[i][ans]) QAQ[++QAQ[]] = hack[i].id, ans -= hack[i].t;
printf("%d\n", QAQ[]);
for(int i = QAQ[]; i >= ; i --)
printf("%d ", QAQ[i]);
return ;
}

U41570 War1

题目背景

XM大战来临之际,ENLIGHTENED总部为了抵御RESISTANCE的进攻,调整了某地Portal的能量值,使得其可以经受更多的打击。

题目描述

ENLIGHTENED总部有N个Portal,编号为1~N,编号为ii的Portal初始能量值为A[i],在Portal之间有M条LINK,每条LINK着连接着两个不同Portal,被连接着的两个Portal可以相互传输能量,每个Portal最多总共只能向其连接着的Portal传输A[i]点能量,现在ENLIGHTENED行动指挥想让每第i个Portal的能量值变为B[i],但他不知道着可不可行,所以找到了你,如果可行的话,需要你求出一种可行的能量传输方案。

能量只能之间传输不能间接传输

输入输出格式

输入格式:

第一行数两个个整数N,M。

第二行有N个整数,第i个整数代表A[i]

第三行有N个整数,第i个整数代表B[i]

下接M行,每行输入两个整数X,Y,代表编号为X的Portal到编号为Y的Portal有一条LINK

输出格式:

若有可行方案输出YES,并且下接N行,每行N个整数,第i行第j个数代表代表编号为i的Portal向编号为j的Portal传输的能量值。若i=j输出第i个Portal传输后留下的能量值。若有多种可行方案输出其中一种即可。

若无可行方案输出NO

输入输出样例

输入样例#1: 复制

3 2
1 2 3
0 0 6
1 3
2 3
输出样例#1: 复制

3 2
1 2 3
0 0 7
1 3
2 3

说明

对于20%的数据 N≤10

对于40%的数据 N≤25

对于60%的数据 N≤50

对于100%的数据 N≤100,M≤2*N,0≤A[i],B[i]≤100

数据范围以及题目条件暗示网络流。

将每个点拆点,分别向起点和终点连边,流量分别为$A[i]$和$B[i]$,中间首先自己向自己连流量为无穷的边,相连的两个点连边,因为是互相,所以有两条。直接跑最大流,判断流量是否和$B[i]$的和相等即是流满,在把中间反边的流量取出来即是两点间运输方案。

一开始一直T,发现是$Bfs$里面判断是用的$dep$,而起点的$dep$没有赋值,导致可能死循环。所以以后还是要习惯用$vis$判断!!

#include<bits/stdc++.h>
#define oo 0x3f3f3f3f
using namespace std; void read(int &x) {
x = ; char ch = getchar();
while(ch > '' || ch < '') ch = getchar();
while(ch >= '' && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
} struct Node {
int u, v, nex, f, rev;
Node(int u = , int v = , int nex = , int f = , int rev = ) :
u(u), v(v), nex(nex), f(f), rev(rev) { }
} Edge[]; int h[], stot = ;
void add(int u, int v, int f) {
++stot;
Edge[stot] = Node(u, v, h[u], f, stot + );
h[u] = stot;
++stot;
Edge[stot] = Node(v, u, h[v], , stot - );
h[v] = stot;
} int n, m, s, t; int vis[], dep[];
queue < int > q;
bool bfs() {
memset(vis, , sizeof(vis));
memset(dep, , sizeof(dep));
q.push(s); vis[s] = ; dep[s] = ;
while(!q.empty()) {
int x = q.front(); q.pop();
for(int i = h[x]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(!dep[v] && Edge[i].f) {
dep[v] = dep[x] + ;
vis[v] = ;
q.push(v);
}
}
}
return vis[t];
} int dfs(int u, int delta) {
if(u == t || delta == ) return delta;
int res = ;
for(int i = h[u]; i && delta; i = Edge[i].nex) {
int v = Edge[i].v;
if(dep[v] == dep[u] + && Edge[i].f) {
int dd = dfs(v, min(delta, Edge[i].f));
Edge[i].f -= dd;
Edge[i^].f += dd;
res += dd;
delta -= dd;
}
}
return res;
} int sum;
int mp[][];
int main() {
scanf("%d%d", &n, &m);
int ans = ;
s = * n + , t = * n + ;
for(int i = ; i <= n; i ++) {
int a;
read(a);
add(s, i, a);
ans += a;
}
for(int i = ; i <= n; i ++) {
int b;
read(b);
add(i + n, t, b);
sum += b;
}
for(int i = ; i <= n; i ++) add(i, i + n, oo);
for(int i = ; i <= m; i ++) {
int a, b;
read(a); read(b);
add(a, b + n, oo);
add(b, a + n, oo);
}
if(ans != sum) {
printf("NO");
return ;
}
ans = ;
while(bfs()) ans += dfs(s, oo);
if(ans != sum) printf("NO");
else {
printf("YES\n");
for(int x = ; x <= n; x ++)
for(int i = h[x]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(v > n) mp[x][v-n] = Edge[Edge[i].rev].f;
}
for(int i = ; i <= n; i ++) {
for(int j = ; j < n; j ++) printf("%d ", mp[i][j]);
printf("%d\n", mp[i][n]);
}
}
return ;
}

【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】的更多相关文章

  1. 洛谷 NOIP提高组模拟赛 Day1

    传送门 ## $T1$ 一道结论题,设原来A队能力最大的是x,那么A队的选择方案就是$2^{x-1}$,B队的选择方案就是$(2^{n-x}-1)$种,因为不能不选.其中$1\leq x\leq n$ ...

  2. l洛谷 NOIP提高组模拟赛 Day2

    传送门 ## T1 区间修改+单点查询.差分树状数组. #include<iostream> #include<cstdio> #include<cstring> ...

  3. [LUOGU] NOIP提高组模拟赛Day1

    题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...

  4. HGOI2010816 (NOIP 提高组模拟赛 day1)

    Day1 210pts(含T1莫名的-10pts和T3莫名的-30pts) 100+70+40=210 rank 29 这道题第一眼看是字符串匹配问题什么KMP啊,又想KMP不会做啊,那就RK Has ...

  5. 10-18 noip提高组模拟赛(codecomb)T2贪心

    T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...

  6. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  7. 计蒜客 2017 NOIP 提高组模拟赛(四)Day1 T2 小X的密室

    https://nanti.jisuanke.com/t/17323 小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1号房间,而出口在 N号房间. 密室的每 ...

  8. 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]

    T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...

  9. HGOI20180815 (NOIP 提高组模拟赛 day2)

    Day 2 rank 11 100+35+30=165 本题是一道数论题,求ax+by=c的正整数对(x,y) x>=0并且y>=0 先说下gcd: 求a,b公约数gcd(a,b) 如gc ...

随机推荐

  1. 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!

    一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...

  2. windows环境cmd下执行jar

    项目目录结构 一,在pom.xml文件里添加配置 <build> <plugins> <plugin> <groupId>org.apache.mave ...

  3. Linux堆内存管理深入分析 (上半部)【转】

    转自:http://www.cnblogs.com/alisecurity/p/5486458.html Linux堆内存管理深入分析(上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越来 ...

  4. bash脚本里su命令执行

    俩种方法 1.可以使用 <<EOF 参数实现. 脚本内容:cat test.sh代码如下: #!/bin/bashsu - test <<EOFpwd;exit;EOF 2.当 ...

  5. nginx配置location总结及rewrite规则写法【转】

    转自 nginx配置location总结及rewrite规则写法 | Sean's Noteshttp://seanlook.com/2015/05/17/nginx-location-rewrite ...

  6. HMM算法

    HMM的应用 HMM是生成模型 词性标注:给定一个词的序列(也就是句子),找出最可能的词性序列(标签是词性).如ansj分词和ICTCLAS分词等. 分词:给定一个字的序列,找出最可能的标签序列(断句 ...

  7. 洛谷P1186玛丽卡

    传送门啦 先跑一遍最短路,将最短路的路径记录下来,然后枚举每一条最短路的边,将其断掉,记录此时的1-n的时间,取其中最大的一个时间即为所求. (通过 $ cut[][] $ 和 $ f[] $ 进行操 ...

  8. 20155225 2016-2017-2 《Java程序设计》第2周学习总结

    20155225 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 比较java和C语言的不同点: java除了基本类型还有类类型 基本类型中还有字节和布尔 对 ...

  9. centos7 vnc 无法systemctl启动

    1.centos7 vnc 无法systemctl启动 报错如下:Failed to start Remote desktop service (VNC) 2.解决办法 错误服务脚本名 vncserv ...

  10. 利用Metrics+influxdb+grafana构建监控平台

    https://blog.csdn.net/fishmai/article/details/51817429