【20170311】白色情人节欢乐赛

我出的水题,因为是白色情人节前一天,所以题目背景。。

试题:/s/1pKKkCeJ         vyh3 (百度云)

T1:chocolate

题意:给你n个妹子,每个妹子对你的初始好感度为c0[i],你不给她x块巧克力她的好感度会下降c1点,你给她y块巧克力她的好感度会上升c2点,现在问你,你有m块巧克力的情况下你可以获得的好感度之和最大是多少。

解题思路:显然是个01背包类型的DP。时间效率O(nm).

标程:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define For(i,a,b) for (int i=a; i<=b; i++)
#define Ford(i,a,b) for (int i=a; i>=b; i--)
#define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
#define mem(qaq,num) memset(qaq,num,sizeof(qaq));
#define ll long long
#define mod 1000000007
#define INF 2000000000
using namespace std;
int c1[5001],c2[5001],f[45001],w1[5001],w2[5001],n,m,sum;
inline int in(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<‘0‘||ch>‘9‘) f=ch==‘-‘?-1:1,ch=getchar();
    while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
    return x*f;
}
void init(){
    n=in(),m=in();
    For(i,1,n)
        sum+=in(),w1[i]=in(),c1[i]=in(),sum-=c1[i],w2[i]=in(),c2[i]=in()+c1[i];
    For(i,0,m) f[i]=sum;
}
void dp(){
    For(i,1,n){
        Ford(j,m,w1[i])
            f[j]=max(f[j-w1[i]]+c1[i],f[j]);
        Ford(j,m,w2[i])
            f[j]=max(f[j-w2[i]]+c2[i],f[j]);
    }
}
int main(){
    init();
    dp();
    printf("%d",f[m]);
}

T2:date

题意简析:题目其实就是给你个森林,问你能否在合法情况下走到叶节点,如果可以输出当时女神好感度最大的路径,否则输出在任意一点结束时的女神最大好感度以及路径。

解题思路:用个虚根将森林转成树,然后按题意遍历模拟一遍即可。时间效率O(n).

标程:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define For(i,a,b) for (int i=a; i<=b; i++)
#define Ford(i,a,b) for (int i=a; i>=b; i--)
#define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
#define mem(qaq,num) memset(qaq,num,sizeof(qaq));
#define ll long long
#define mod 1000000007
#define INF 2000000000
using namespace std;
struct zxy{
    int fa,lson,rbra,val,t,t2;
}tr[200001];
int n,e,ans=0,np=0;
ll f[200001],m,q;
inline ll in(){
    ll x=0,f=1;
    char ch=getchar();
    while (ch<‘0‘||ch>‘9‘) f=ch==‘-‘?-1:1,ch=getchar();
    while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
    return x*f;
}
inline void doit(int k,ll t){
    if (tr[k].rbra) doit(tr[k].rbra,t);
    if (f[tr[k].fa]-tr[k].t2<q&&tr[k].fa) return;
    if (t+tr[k].t2>m) return;
    f[k]=f[tr[k].fa]+tr[k].val-tr[k].t2;
    if (f[k]<q&&k) return;
    if (f[k]>f[np]) np=k;
    if (!tr[k].lson){
        if (f[k]>f[ans]){
            ans=k;
        }
        return;
    }
    doit(tr[k].lson,t+tr[k].t+tr[k].t2);
    return;
}
inline void print(int k){
    if (k==0) return;
    print(tr[k].fa);
    printf("%d ",k);
}
int main(){
    n=in(),m=in(),q=in();
    e=in();
    For(i,1,e){
        int x=in(),y=in(),t=in();
        tr[y].fa=x;
        tr[y].rbra=tr[x].lson;
        tr[x].lson=y;
        tr[y].t2=t;
    }
    For(i,1,n)
        tr[i].t=in();
    For(i,1,n)
        tr[i].val+=in();
    For(i,1,n)
        if(!tr[i].fa){
            tr[i].rbra=tr[0].lson;
            tr[0].lson=i;
        }
    doit(0,0);
    if (!ans){
        printf("There are no possibilities that zxyer can spend the whole night with zxy.\n");
        printf("%I64d\n",f[np]);
        print(np);
    }
    else{
        printf("Zxyer can spend the whole night with zxy succeesfully.\n%I64d\n",f[ans]);
        print(ans);
    }
    return 0;
}

T3:light

题意简析:给你张图叫你求最小割。

解题思路:毫无建图难度对不对?最小割=最大流,跑一遍最大流不就行了?

标程:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define For(i,a,b) for (int i=a; i<=b; i++)
#define Ford(i,a,b) for (int i=a; i>=b; i--)
#define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
#define mem(qaq,num) memset(qaq,num,sizeof(qaq));
#define ll long long
#define mod 1000000007
#define INF 2000000000
using namespace std;
struct zxy{
    int next,to,v;
}edge[100010];
int n,cnt=1,e,p,head[2001],lev[2001],que[2001];
inline int in(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<‘0‘||ch>‘9‘) f=ch==‘-‘?-1:1,ch=getchar();
    while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
    return x*f;
}
inline void ins(int x,int y,int l){
    edge[++cnt].to=y,edge[cnt].next=head[x],edge[cnt].v=l,head[x]=cnt;
    edge[++cnt].to=x,edge[cnt].next=head[y],edge[cnt].v=0,head[y]=cnt;
}
inline bool bfs(int s,int tt){
    mem(lev,-1);
    int t=1,h=0;
    que[0]=s;
    lev[s]=0;
    do{
        h++;
        int k=head[que[h]];
        while(k){
            if (lev[edge[k].to]==-1&&edge[k].v){
                lev[edge[k].to]=lev[que[h]]+1;
                que[++t]=edge[k].to;
            }
            k=edge[k].next;
        }
    }while(h<t);
    return lev[tt]!=-1;
}
inline int dfs(int u,int v,int f){
    if (u==v) return f;
    int used=0,k=head[u];
    while(k){
        if (edge[k].v&&lev[edge[k].to]==lev[u]+1){
            int w=dfs(edge[k].to,v,min(edge[k].v,f-used));
            used+=w;
            edge[k].v-=w;
            edge[k^1].v+=w;
            if (used==f) return used;
        }
        k=edge[k].next;
    }
    if(!used) lev[u]=-1;
    return used;
}
int dinic(int s,int t){
    int flow=0;
    while(bfs(s,t)){
        flow+=dfs(s,t,INF);
    }
    return flow;
}
void init(){
    n=in(),e=in(),p=in();
    For(i,1,e){
        int x=in(),y=in(),l=in();
        ins(x,y,l);
    }
}
void solve(){
    int ans=dinic(0,n+1);
    if (p<ans) printf("-1");
    else printf("%d",ans);
}
int main(){
    init();
    solve();
}
时间: 2024-10-12 22:20:40

【20170311】白色情人节欢乐赛的相关文章

NOIP模拟 (8-2情人节欢乐赛) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目来自hzwer的模拟题 果实计数 (count.pas/.c/.cpp) 时间限制:1s,空间限制32MB 题目描述: 淘淘家有棵奇怪的苹果树,这棵树共有n+1层,标号为0~n.这棵树第0层只有一个节点,为根节点.已知这棵树为b叉树,且保证是一颗满b叉树. 现在,该树第n层的每个节点上都结出了一个苹果,淘淘想知道共结了多少苹果.由于数量可能很大,答案要求输出mod k后的结果. 输入描述: 给出第1层的节点数b和层数n和k

综合-某假期欢乐赛 (Apri, 2018)

假期欢乐赛,确实挺轻松的,被逼迫写了题解. A.推数按列观察,有的列有多个格子,看起来好复杂啊,先放一放.按行观察,黑色格子在 i 行 j 列:当 i 是奇数,对应数字第 i 位是 j-1当 i 是偶数,对应数字第 i 位是 9-j B.体重某位同学不是中间体重的充要条件是,比他重的人数 >= mid 或 比他轻的人数 >= midx 比 y 重,则 x, y 有单向连通关系,G[x][y] = true .比 y 重的人数就是满足 G[i][y] = true 的 i 的数量.比 y 轻的人

欢乐赛解题报告

~~一场不欢乐的欢乐赛 时间分配::T1做的时候还可以,大约三十分钟写了个深搜(鬼知道我为啥不用广搜,大概是因为快半个月没写了)写完后去研究第二题,刚开始以为是贪心,很快写了出来,但是自己推了一会举出了反例.于是自己想了很多方法,但是都是基于贪心,写了一个多小时,写炸了,没办法又改成了贪心.第三题并不会,然后搜索大法过了一个点,(输出-1也是一个点) 整体感觉::还是太弱,T1是会的,但是还是没做对,大概是独立做题少的缘故吧,平常做题都没有思考太多时间.T2贪心T3暴力,貌似自己啥都不会.到现在

Comet OJ - 2019 六一欢乐赛

传送门 #A: 思路:等差数列求和,看成俩次1+2+…+ n,多加的n减去,所以 ans = n*(n+1) - n. AC代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 int n; 8 while(cin >> n) 9 { 10 cout << n*(n+1) - n <

2017端午欢乐赛——Day1T3(树的直径+并查集)

//前些天的和jdfz的神犇们联考的模拟赛.那天上午大概是没睡醒吧,考场上忘了写输出-1的情况,白丢了25分真是**. 题目描述     小C所在的城市有 n 个供电站,m条电线.相连的供电站会形成一个供电群,那么为了节省材料,供电群是一棵树的形式,也即城市是一个森林的形式(树:V个点,V-1条边的无向连通图,森林:若干棵树).每个供电群中不需要所有供电站都工作,最少只需要一个工作,其余的就都会通过电线收到电,从而完成自己的供电任务.当然,这样会产生延迟.定义两个供电站的延迟为它们之间的电线数量

白色情人节为你身边的程序员献上一份礼物!

马上就是情人节了,还在为买什么样的礼物给自己的情人而苦恼吗?唉,对方是个极客或者程序员,也是蛮纠结的一件事啊! 那么这篇文章你绝对不能错过,这里推荐的礼物你的极客情人肯定喜欢--再偷偷说一句,想让别人送你,那就@心爱的ta吧! 1.漫画人物T恤 印有漫画人物或科幻电影名言的T恤,已经掀起了很长一段时间的热潮,是包括极客在内很多人的必备.价格合理,品种繁多,而且还可以上网选购,还不买,买,买. 2.海报 在极客眼里,不仅T恤是宝,海报也是.如果刚好是ta求而不得的限量海报,ta肯定会爱死你了. 3

暑假爆零欢乐赛SRM08题解

这真的是披着CF外衣的OI赛制?我怎么觉得这是披着部分分外衣的CF?果然每逢cf赛制必掉rating,还是得%%%cyc橙名爷++rp.. A题就是找一找序列里有没有两个连在一起的0或1,并且不能向两端延伸(比如--1001--或110--或者--100),找到了之后就可以把整个序列分成这两个数左边,这两个数和他的右边三部分,然后这两个0或1每个都能与左边右边串在一起构成两个相同的子序列,并且这个子序列在原序列中只会出现这两次,满足题目条件.如果没找到,再看看原来的序列里是不是只有两个0或1,那

CH Round #56 - 国庆节欢乐赛解题报告

最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树,其中一些树上结有能够产生能量的魔力水果.已知每个水果的位置(Xi,Yi)以及它能提供的能量Ci.然而,魔幻森林在某些时候会发生变化:(1) 有两行树交换了位置.(2) 有两列树交换了位置.当然,树上结有的水果也跟随着树一起移动.不过,只有当两行(列)包含的魔力水果数都大于0,或者两行(列)都没有魔

【学长虐学弟欢乐赛系列】Round1

第一套题 出题人:Time-Machine 目标地址:Time-Machine学长的blog 试题下载地址 数据下载地址 据说题目难度T3<T1<T2 这不科学QAQ 光荣爆零QwQ奇怪的错误是说不尽的 T1 Hope 主要题干:首先你列出了两个长度为 n 的数表 a[],b[],其中每个数 a[i]用二进制表示一个集合.例如数字 5=( 101) 2 就代表集合{1,3}.第 i 次实验会准备一个小盒子,里面装着集合 a[i]所有非空子集的纸条,然后苗木诚会从中摸一张纸条.如果满足他摸的这张