gdufs新手赛赛后补题

来源:互联网 发布:达索软件销售 编辑:程序博客网 时间:2024/05/17 22:14

先放题

Problem E: 叉叉哥哥的时光机
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 352 Solved: 3
[Submit][Status][Web Board]
Description
随着时间一长,一言难尽的事情越来越多,叉叉哥哥最近回想起过去,他觉得生活变得越来越糟,时间也变得越来越快,就连天气都越来越冷了,Alice十分同情叉叉哥哥,她决定将自己的时光机器借给叉叉哥哥使用,但是她的时光机器只能使用一次,这意味着叉叉哥哥只能回到一个时间点去感受快乐,但世界总是告诉我们凡事都有利弊,叉叉哥哥深明这点,他决定给所有时间轴上的事件一个不愉快值,对于每个事件,不愉悦度=|当前所在时间点-事件发生时间点|*该事件的不愉悦值,这意味这叉叉哥哥回到了任意一个时间点时,在这之前发生的事件和在这之后发生的事件都会增加他的不愉悦度,你可以帮叉叉哥哥找出他应该回到时间轴上的哪个点从而得到最小的不愉悦度之和吗?(|XX|代表XX的绝对值,时间轴上的点坐标可为负数)
Input
第一行:一个整数n(2<=n<=10000)代表事件的个数
第2 - n+1行:每行两个数,中间用空格分隔,分别是事件发生的时间以及该事件的不愉快值(-10^5 <= X[i] <= 10^5,1 <= W[i] <= 10^5)
Output
输出最小的不愉悦度之和。
Sample Input
5
-1 1
-3 1
0 1
7 1
9 1

Sample Output
20

HINT

对于样例,如果用时光机跳回0点,得到的不愉悦度和为 1*1+3*1+0*1+7*1*9*1=20

注意数据范围!请使用long long int!


zjBp4jd FAQ http://t.cn/zjHKbmN Linux问题看http://t.cn/aWnP1nProblem G: 叉叉哥哥的菜肴
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 17 Solved: 2
[Submit][Status][Web Board]
Description
最近叉叉哥哥在学做菜~马上食神大赛就开始啦!这次食神大赛的规则是,看谁做出的一日三餐的种类最多!一日包括三餐,分别是早餐,午餐和晚餐。叉叉哥哥为这一日三餐准备了各种各种的菜式!当然有一些菜式不能一起吃!每一种菜式由各种调料组成,当然,调料也有很多种牌子,每一种牌子都有它的特点。所以使用不同的牌子的调料去做菜,会使得菜的味道变得不一样。我们把味道不一样的菜视为不同的菜。一些常用的调料会被广泛的应用在各种菜上,比如说盐。这个时候,我们所有用了盐的菜,都会使用同一个牌子的盐(只要一种调料被用了多次,那么所有用了这个调料的菜都会使用一个牌子的调料)。现在叉叉哥哥想知道,通过不同菜式的搭配和调料的搭配,他能制造出多少种不同的一日三餐?
Input
输入包括多行
第一行包括5个整数
R,S,M,D,N,中间用空格隔开 (1<=R,S,M,D,N<=10)
其中,R代表这个世界上有多少种调料。
S,M,D分别代表早餐,中餐,晚餐,有多少种菜可以选择
N代表有多少对菜式不能在一日一起吃。
第二行包括R个整数Bi(1<=i<=R),代表第i种调料有Bi种牌子。第i种调料的编号为i(1<=Bi<=10)
接下来按顺序共S+M+D行,先是S行,后M行,后D行,从现在开始,第几行就是该菜的编号。
每行第一个数字为K,代表该菜式由K种调料组成(所有调料必须用上)接下来K个数字Ii代表该调料的编号。(1<=K,Ii<=10)
接下来N行,每行两个编号X,Y,代表哪两个菜不能一起吃。数据保证不会出现重复的对。(1<=X,Y<=10)

输入样例1:

6 1 1 1 0

2 3 1 5 3 2

2 1 2

3 3 4 5

1 6

输入样例 2:

3 2 2 1 1

2 3 2

1 1

1 2

1 2

1 3

1 1

2 3

输入样例3:

3 1 1 1 1

5 5 5

3 1 2 3

3 1 2 3

3 1 2 3

2 1

Output
一个数字即叉叉哥哥能做出多少种不同的一日三餐!
输出样例1:

180

输出样例 2:

22

输出样例3:

0

Sample Input
3 2 2 1 1
2 3 2
1 1
1 2
1 2
1 3
1 1
2 3

Sample Output
22

HINT

对于输入样例。早中晚各有一种菜

有六种调料,每种有2 3 1 5 3 2个牌子

然后

早餐的一个菜,的调料有 1 2号 (该菜为1号菜)

中餐的一个菜的调料 有 3 4 5 号 (该菜为2号菜)

晚餐的一个菜的调料有 6 号 (按顺序,该菜为3号菜)

所以一日三餐的的种类一共有

2 * 3 * 1 * 5 * 3 * 2 =180种

对于第二个样例

注意有的菜用了同一种调料,所以那种调料只能用同一个牌子。

对于第三个样例

因为 2号菜和1号菜不能在一日内一起吃,所以一种都做不出。

思路:我看了我比赛打到一半的代码,对比了一下师兄的,发现思路基本一样,就是用向量保存每道菜药用的调料,然后用一个三重嵌套for列举每种可能的组合,然后再每种组合中,用set来去除掉重复的元素,还有一个问题就是表示不能一起出现的两道菜,师兄使用二维数组来表示状态的思想还是要好好学习一下,真的有点巧妙哈哈哈哈,然后就照着代码敲就a了,思维上还是没有什么难度的,有的话就是代码实现的时候那个状态表示有点难度,还有问题也是挺复杂的嗯。就这样吧贴上我的代码:

#include <iostream>#include <algorithm>#include <string.h>#include <memory.h>#include <math.h>#include <set>#include <vector>#include <map>#include <stdio.h>#define MAXN 1005typedef long long int ll;using namespace std;vector<int> cai[105000];int main(){    int r,s,m,d,n;    ll ar[105000];    cin>>r>>s>>m>>d>>n;    for(int i=1;i<=r;i++){        cin>>ar[i];    }    int k;    for(int i=1;i<=s+m+d;i++){        cin>>k;        int temp;        for(int j=1;j<=k;j++){            cin>>temp;            cai[i].push_back(temp);        }    }    bool ban[100][100];//    int temp1,temp2;    memset(ban,0,sizeof(ban));    for(int i=1;i<=n;i++){        cin>>temp1>>temp2;        ban[temp1][temp2]=1;        ban[temp2][temp1]=1;    }    ll sum=0;    for(int i=1;i<=s;i++){        for(int j=s+1;j<=s+m;j++){            if(ban[i][j]){                continue;            }            for(int k=s+m+1;k<=s+m+d;k++){                if(ban[i][k]||ban[j][k]){                    continue;                }                set<int> ss;                int iter;                for(iter=0;iter<cai[i].size();iter++){                    ss.insert(cai[i][iter]);                }                for(iter=0;iter<cai[j].size();iter++){                    ss.insert(cai[j][iter]);                }                for(iter=0;iter<cai[k].size();iter++){                    ss.insert(cai[k][iter]);                }                set<int>::iterator it;                ll temp=1;                for(it=ss.begin();it!=ss.end();it++){                    temp*=ar[(*it)];                }                sum+=temp;            }        }    }    cout<<sum<<endl;    return 0;}

Problem H: 叉叉哥哥的脱口秀
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 27 Solved: 1
[Submit][Status][Web Board]
Description
一眨眼,叉叉哥哥来到了老年时期了。回想当年,曾经是多么的辉煌。叉叉哥哥,曾经是一个演员。他经常参与演出两种剧,参与这两种剧都会影响他的魅力值。这两种剧分别是喜剧和悲剧。叉叉哥哥只擅长演喜剧。所以当叉叉哥哥拍完喜剧后,他的魅力值会上升A,当拍完一场悲剧后,他的魅力值会减去B(叉叉哥哥演悲剧总会笑……)。叉叉哥哥又很喜欢参加脱口秀节目!脱口秀节目会使他的人气值大大改变!具体的,当他参加完脱口秀后,再去演喜剧,他的魅力值会增加C而不是A,如果演的是悲剧,他的魅力值会减少D而不是B(因为他笑的更厉害了)。叉叉哥哥很喜欢参加脱口秀,但是他又不想自己的魅力值变成负数,所以他想找个一个合适的时间点去参加脱口秀,使得自己的魅力值不会变成负数。
我们假设叉叉哥哥的演员生涯开始的时间为0,在那个时候,叉叉哥哥的魅力值为S,如果叉叉哥哥在T时间参加了脱口秀,那么这个脱口秀会影响接下来的这个时间区间[T,T+LEN )内的所有演出(即A变C,B变D,注意开闭区间)。其中LEN为这个脱口秀的影响时间长度。叉叉哥哥真的很想参加脱口秀,但他不想自己的魅力值在参加脱口秀前变为负数,又不想在参加脱口秀后的LEN时间内自己的魅力值变为负,当然过后就没所谓了。现在他告诉你他的行程表,请你帮帮他,找到一个最好的时间,去参加脱口秀。叉叉哥哥很喜欢演戏,所以每一部戏他都会参与演出,无论魅力值怎么样。注意,每个整数时间点都有一场脱口秀,但叉叉哥哥只能参加一场脱口秀。参加完脱口秀后,叉叉哥哥可以马上去演戏。
Input
输入包括多行。
第一行包括7个正整数,中间用空格隔开,分别为
N A B C D S LEN (1<=N<=300000,0<=S<=10^9,1<=A,B,C,D,LEN<=10^9)
其中N为已知的戏的数量.
接下来N行,每行包括两个整数Ti,Qi (1<=Ti<=10^9,0<=q<=1)
其中Ti为演出的戏的时间点,q为戏的类型,1代表喜剧,0代表悲剧。
其中Ti会以升序给出,并保证所有的Ti都不一样。

输入样例1:

5 1 1 1 4 0 5
1 1
2 1
3 1
4 0
5 0

输入样例2:

1 1 2 1 2 1 2
1 0

输入样例3:

10 1 1 1 2 0 10

1 1

2 1

3 0

4 0

5 1

6 1

7 1

8 1

9 1

10 1

Output
输出包括一个整数。代表参加脱口秀的时间点。如果有多个时间可选,输出最小的。如果没有时间点符合题目要求,输出-1.
输出样例1:

6

输出样例2:

-1

输出样例3:

5

Sample Input
10 1 1 1 2 0 10
1 1
2 1
3 0
4 0
5 1
6 1
7 1
8 1
9 1
10 1

Sample Output
5

HINT

对于第一个样例

只能在参加完所有戏后,参加脱口秀。否则肯定会有个时间点魅力值变为负。

对于第二个样例

无论在哪个时间点参加脱口秀,都会在参加脱口秀之前或中间魅力值变为负。

对于第三个样例

在5之后参加脱口秀都是可以的,但5是最小的一个。

假设在4参加。那么他的魅力值变化为

0 -> 1 -> 2 ->1 -> -1

所以不行,最小就是5

思路:首先先分析一下暴力求解是肯定不能做出来的,然后题解里面说是用尺取法嗯。

原创粉丝点击