牛客小白月赛2
A:数字方阵
题目描述
总是对数字的神秘感感到好奇。这次,他在纸上写下了 个从 到 的数字,并把这些数字排成了 的方阵。他惊奇地发现,这个方阵中每行、每列和两条主对角线上的数字之和都不一样。他想要更多的方阵,但他再写不出来了。于是他㕛跑来找你,请你给他一个边长为 的满足上述性质的方阵。
输入描述:
输入共一行,一个整数
,意义同题面描述。
输出描述:
输出共
行,每行
个整数,表示答案方阵。
输出任意一种可行方案即可。
示例1
输入
3
输出
1 2 3 8 9 4 7 6 5
备注:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) #define ll long long int a[1003][1003]; int main() { int n,tot=1; scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<n;j++) a[i][j]=tot++; } for(int i=1;i<=n;i++) a[i][n]=tot++; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { printf("%d%c",a[i][j],j==n?'\n':' '); } } return 0; }
B:小马过河
题目描述
开始涉猎几何领域了。他现在正在研究小马喝水问题。
众所周知,这个问题中有一匹口渴的小马,一条笔直的河,以及小马的家。小马需要去河边喝水,然后再去家里。它需要走最短的路径。
解决这个问题也很简单,其中有一个步骤是要做小马家关于河水的对称点。
正对此感到一些烦恼。他不会做这个。他想请你帮他作一条过小马家且垂直于河水的线,然后告诉 垂足的位置。
输入描述:
第一行一个整数
,表示
的询问个数。
接下去
行,每行
个实数
,表示小马家在点
,河水为直线
输出描述:
输出共
行,每行两个实数
, 表示答案垂足点的坐标
。
当你的答案与标准输出的误差小于 时,视为答案正确。
示例1
输入
3 0 1 0 0 1 1 2.13 -6.89 1.78 1.20 -7.73 0.56 3.473 -4.326 -4.851 -0.819 2.467 -2.729
输出
0.5000000 0.5000000 1.5864392 1.1869738 3.7990750 -3.076672
备注:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) #define ll long long int main() { int t; scanf("%d",&t); while(t--) { double x1,x2,x3,y1,y2,y3,k1,k2; cin>>x1>>y1>>x2>>y2>>x3>>y3; if(x2==x3) printf("%.8lf %.8lf\n",x2,y1); else if(y2==y3)printf("%.8lf %.8lf\n",x1,y2); else { k1=(y3-y2)/(x3-x2); k2=(x2-x3)/(y3-y2); double x,y; x=(y2-y1-(k1*x2-k2*x1))/(k2-k1); y=(k2*(y2-y1-k1*x2+k1*x1))/(k2-k1)+y1; printf("%.8lf %.8lf\n",x,y); } } return 0; }
C:真真假假
题目描述
乾为天,刚健中正,自强不息;坤为地,柔顺伸展,厚载万物。
乾卦:天行健,君子以自强不息。困龙得水好运交,不由喜气上眉梢,一切谋望皆如意,向后时运渐渐高。
坤卦:地势坤,君子以厚德载物。肥羊失群入山岗,饿虎逢之把口张,适口充肠心欢喜,卦若占之大吉昌。
算卦先生来问你,对于每个他给出的 C++ 头文件,请告诉他是否存在。
头文件列表:algorithm,
bitset, cctype, cerrno, clocale, cmath, complex, cstdio, cstdlib,
cstring, ctime, deque, exception, fstream, functional, limits, list,
map, iomanip, ios, iosfwd, iostream, istream, ostream, queue, set,
sstream, stack, stdexcept, streambuf, string, utility, vector, cwchar,
cwctype
输入描述:
第一行一个正整数 ,表示询问个数。
接下去 行,每行一个仅由小写字母构成的字符串 ,表示一个询问。
输出描述:
输出共
行,每行一个字符串
表示这个头文件存在,或
表示这个头文件不存在。
示例1
输入
3 cstdio splay fstream
输出
Qian Kun Qian
备注:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) #define ll long long char a[10006]={"algorithm,bitset,cctype,cerrno,clocale,cmath,complex,cstdio,cstdlib,cstring,ctime,deque,exception,fstream,functional,limits,list,map,iomanip,ios,iosfwd,iostream,istream,ostream,queue,set,sstream,stack,stdexcept,streambuf,string,utility,vector,cwchar,cwctype#"}; set<string>s; string ss,c; int main() { ss=""; for(int i=0;a[i]!='#';i++) { if(a[i]!=',') ss+=a[i]; else { s.insert(ss); ss=""; } } s.insert(ss); int n; scanf("%d",&n); while(n--) { cin>>c; if(s.count(c)) printf("Qian\n"); else printf("Kun\n"); } return 0; }
D:虚虚实实
题目描述
震为雷,临危不乱,亨通畅达;巽为风,柔顺伸展,厚载万物。算卦先生来问你,对于每个他给出的无向图,是否存在一条路径能够经过所有边恰好一次,并且经过所有点?不需要满足最后回到起点。
震卦:洊雷,震,君子以恐惧修省。一口金钟在淤泥,人人拿着当玩石,忽然一日钟悬起,响亮一声天下知。
巽卦:随风,巽,君子以申命行事。一叶孤舟落沙滩,有篙无水进退难,时逢大雨江湖溢,不用费力任往返。
输入描述:
第一行一个数
,表示有
组数据。对与每组数据,第一行有两个数
,接下去
行每行两个数
描述一条无向边
。图不保证联通。
输出描述:
对于每组数据,如果存在,输出
,否则输出
。
示例1
输入
2 2 2 1 1 2 1 4 6 1 3 1 4 1 2 3 2 4 2 4 3
输出
Zhen Xun
备注:
欧拉路径,欧拉环符合
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) typedef long long ll; const int maxn = 36; int degree[maxn]; int ma[maxn][maxn]; int vis[maxn]; int n,m; int ans; void init() { memset(ma,0,sizeof(ma)); memset(vis,0,sizeof(vis)); memset(degree,0,sizeof(degree)); } void dfs(int x) { vis[x] = 1; for(int i=1;i<=n;i++) { if(!vis[i] && ma[x][i]) dfs(i); } return ; } int check() { for(int i=1;i<=n;i++) { if(degree[i] % 2 != 0) ans++; } return ans; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); int a,b; int cnt = 0; int flag = 0; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); ma[a][b]=ma[b][a]=1; degree[a]++; degree[b]++; } dfs(1); ans = 0; for(int i=1;i<=n;i++) { if(!vis[i]) { flag = 1; break; } } if(!flag && (check()==2 || check()==0)) printf("Zhen\n"); else printf("Xun\n"); } return 0; }
E:是是非非
题目描述
坎为水,险阳失道,渊深不测;离为火,依附团结,光明绚丽。
坎卦:水洊至,习坎;君子以常德行,习教事。一轮明月照水中,只见影儿不见踪,愚夫当财下去取,摸来摸去一场空。
离卦:明两作,离,大人以继明照四方。官人来占主高升,庄农人家产业增,生意买卖利息厚,匠艺占之大亨通。
有一些石子堆,第 堆有 个石子。你和算卦先生轮流从任一堆中任取若干颗石子(每次只能取自一堆,并且不能不取),取到最后一颗石子的人获胜。
算卦先生来问你,如果你先手,你是否有必胜策略?若是改动其中几个石子堆中石子的数量呢?
输入描述:
第一行两个正整数 ,表示有 个石堆, 次操作。
第二行 个整数,第 个数 表示第 个石堆初始有 个石子。
接下去 行,每行两个正整数 ,表示把第 堆石子的个数修改成 。操作是累计的,也就是说,每次操作是在上一次操作结束后的状态上操作的。
输出描述:
共 行,输出每次操作之后先手是否有必胜策略。
如果有,输出 ,否则输出 。
示例1
输入
5 4 6 7 3 4 5 1 6 2 1 2 4 5 5
输出
Kan Kan Li Li
备注:
尼姆博弈
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) #define ll long long ll a[100006]; int main() { ll n,m,x,y,ans,pos; scanf("%lld%lld",&n,&m); scanf("%lld",&a[1]); ans=a[1]; for(int i=2;i<=n;i++) { scanf("%lld",&a[i]); ans^=a[i]; } while(m--) { scanf("%lld%lld",&x,&y); ans^=a[x]; a[x]=y; ans^=a[x]; puts(ans?"Kan":"Li"); } return 0; }
F:黑黑白白
题目描述
艮为山,动静得宜,适可而止;兑为泽,刚内柔外,上下相和。
艮卦:兼山,艮;君子以思不出其位。财帛常打心头走,可惜眼前难到手,不如意时且忍耐,逢着闲事休开口。
兑卦:丽泽,兑;君子以朋友讲习。这个卦象真可取,觉着做事不费力,休要错过这机关,事事觉得随心意。
有一个棋子放在一颗有根树的根上。你和算卦先生轮流把这个棋子向所在点的其中一个儿子移动(只能移动到儿子)。不能再移动就算失败(即棋子所在节点没有儿子)。
算卦先生来问你,如果你先手,你是否有必胜策略?
输入描述:
第一行一个数 ,表示有 组数据。
接下去每组数据的第一行有两个数 ,表示树有 个节点,其中 为根节点编号(从 开始编号)。
接下去 行每行两个数字 ,表示点 和 之间有一条边。
输出描述:
每组数据输出一行,
表示先手有必胜策略,
表示没有。
示例1
输入
2 3 1 1 2 2 3 5 4 1 2 1 3 3 4 4 5
输出
Dui Gen
备注:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) typedef long long ll; vector<int>v[10006]; int n,t,root,x,y; bool dfs(int u,int fa) { for(int i=0;i<v[u].size();i++) { if(v[u][i]==fa) continue; if(!dfs(v[u][i],u)) return 1; } return 0; } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&root); for(int i=1;i<=n;i++) v[i].clear(); for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } puts(!dfs(root,0)?"Dui":"Gen"); } return 0; }
G:文
题目描述
Sεlιнα(Selina) 开始了新一轮的男友海选。她要求她的男友要德智体美劳样样都全。首先进行的是文化知识竞赛。
Sεlιнα 精心准备了一套选择题,每个选择题有且只有一个正确答案。她邀请参赛男友们来答题,并回收了试卷准备批改。可是她却犯了愁。她不知道怎么快速地批改完这些试卷。她知道你是计算机大佬,就跑来请你写个程序帮她批改试卷。
Sεlιнα 会给你一份标准答案,再给你每个参赛男友的答卷。答卷中的每道题可能有一个答案, 也可能没有作答。你要做的是最后告诉 Sεlιнα 谁拿到了最高分,以及最高分的分数(分数为 分制)。Sεlιнα 喜欢优美的名字,所以如果有同样的分数,请告诉她其中字典序最小的选手名字。
不要偷懒哦!要是你告诉了 Sεlιнα 错误的答案,她会很生气的!
输入描述:
第一行两个整数 ,表示有 道选择题和 个参赛男友。第二行一个长为 的字符串,表示标准答案。其中第 个字母表示第 个选择题的答案。保证所有字母在 中。接下去 行,每两行表示一个参赛男友:
· 第一行一个字符串,表示参赛者姓名,保证姓名仅由大小写字母组成;
· 第二行一个长为 的字符串,表示该参赛者的答案。其中第 个字母表示该参赛者对于第 个选择题的答案。保证所有字母在 中。 表示该参赛者未作答此题。
输出描述:
输出共两行,第一行是最高分的参赛男友姓名,第二行为其分数。
分数为 分制,保留两位小数。若有多人同分,输出字典序最小的姓名。
示例1
输入
5 3 ADBBC spiderman ADBAC niconico BDXBC ekstieks ACBBC
输出
ekstieks 80.00
备注:
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) #define ll long long int n,m; string s,ss,c,ch; int main() { int ans=-1; scanf("%d%d",&n,&m); cin>>c; for(int i=0;i<m;i++) { cin>>ss>>ch; int pos=0; for(int j=0;j<n;j++) { if(c[j]==ch[j]) pos++; } if(ans<pos){s=ss;ans=pos;} else if(ans==pos) { if(s>ss) s=ss; } } cout<<s<<endl; printf("%.2lf\n",(100.0*ans)/(n*1.0)); return 0; }
H:武
题目描述
其次,Sεlιнα(Selina) 要进行体力比武竞赛。
在 Sεlιнα 所在的城市,有 个街区,编号为 ,总共有 条的街道连接这些街区, 使得每两个街区之间都直接或间接地有街道将它们相连。Sεlιнα 把通过了文化知识竞赛的参赛男友们召集到她家所在的街区 ,并以这个街区为起点,让所有参赛男友们向其他街区跑去。这些参赛者们被命令不准重复跑某条街道,而且在规定时间内要尽可能地跑远。比赛结束后,所有参赛者将停留在他们此时所在的街区。之后 Sεlιнα 开始视察结果。现在她知道每个街区都有一些她的参赛男友停留着,她现在想先去看看离她家第 近的街区。所以作为一位好帮手,你的任务是要告诉她所有街区中,离 Sεlιнα 家第 近的街区与 Sεlιнα 家之间的距离。
输入描述:
第一行三个整数,,含义同题面描述。
接下去 行,每行三个整数,,表示从第 个街区到第 个街区有一条权值为 的街道相连。街区从 开始标号。
输出描述:
输出共一行,一个整数,表示所有街区与 Sεlιнα 家所在街区之间最近距离的第
小值。
示例1
输入
3 3 2 1 2 4 2 3 5
输出
9
示例2
输入
6 4 3 1 2 7 2 3 2 2 4 2 2 5 10 3 6 3
输出
7
备注:
姓名长度
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) #define ll long long #define pa pair<int,int> ll n,m,x,y,w,p; struct node { int to,next,v; }; node edge[200006]; ll cnt=1,head[200001],dis[200001]; void add(int u,int v,int w,int k) { edge[k].to=v; edge[k].next=head[u]; head[u]=k; edge[k].v=w; } void dijkstra(int s) { priority_queue<pa,vector<pa>,greater<pa> >q; int i,now; for (i=1;i<=n;i++) dis[i]=0x7fffffff; dis[s]=0; q.push(make_pair(0,s)); while (!q.empty()) { now=q.top().second; q.pop(); for (i=head[now];i;i=edge[i].next) if (dis[now]+edge[i].v<dis[edge[i].to]) { dis[edge[i].to]=dis[now]+edge[i].v; q.push(make_pair(dis[edge[i].to],edge[i].to)); } } } int main() { scanf("%d%d%d",&n,&m,&p); int k=0; for(int i=0;i<n-1;i++) { scanf("%d%d%d",&x,&y,&w); add(x,y,w,++k); add(y,x,w,++k); } dijkstra(m); sort(dis+1,dis+n+1); printf("%d\n",dis[p+1]); return 0; }
I:艺
题目描述
接下去,Sεlιнα(Selina) 又搞了个文艺竞演。
虽说是文艺竞演,其实只是为了满足 Sεlιнα 的内心企盼——看群男友献歌献舞。她排列好了各个参赛男友的节目顺序,然后将他们安排在两个舞台上表演,自己则在演播室里使用两台闭路电视同时观看。万万没想到的是,当一切准备就绪时,其中一台电视炸了,她不会修,也没有时间修。于是只能尴尬地使用一台闭路电视观看两个舞台上的节目。当然,这台电视不支持分屏同时观看,所以 Sεlιнα 只能不停地换台观看。现在,作为导演的 Sεlιнα 已经知道了两个舞台的节目 单以及每个节目 对于她所能产生的愉悦度 ,她想安排电视在每个时刻播放的频道(可以在某些时刻不看),使得自己能得到最大的愉悦度。现在请优秀的你告诉 Sεlιнα 最大能产生的愉悦度是多少。
要注意的是,文艺竞演没有广告插播,所以当一个节目结束时,另一个节目会立刻开始演出。 并且 Sεlιнα 看节目以分钟为单位,也就是说,她只能在每分钟结束的那一刻切换舞台。节目对 Sεlιнα 产生愉悦度是以分钟为单位的,也就是说,她看第 个节目每一分钟就会产生 的愉悦度。而 Sεlιнα 对节目的完整性丝毫不在意,没有完整地看一个节目是没有关系的。
输入描述:
第一行三个数 ,表示舞台一有 个节目,舞台二有 个节目,总时长为 分钟。
接下去 行,每行两个整数 ,表示舞台一的第 个节目在第 分钟结束后开始,每分钟能产生愉悦度 。当一个节目开始时,这个舞台之前正在播放的节目直接停止,中间没有暂停。
接下去 行,每行两个整数 ,表示舞台二的第 个节目在第 分钟结束后开始,每分钟能产生愉悦度 。当一个节目开始时,这个舞台之前正在播放的节目直接停止,中间没有暂停。
数据保证每个舞台都有一个在 分钟时开始的节目(即最开始的节目),并且在同一个舞台中没有两个节目开始时间相同(即没有一个节目时长为 )。数据不保证输入中每个舞台的 会从小到大排序。
输出描述:
输出共一行,一个整数,表示最大的愉悦度。
示例1
输入
2 2 5 2 3 0 2 0 3 3 1
输出
15
说明
在这个样例中,Sεlιнα 在开始时观看频道二的节目,每分钟产生愉悦度 ;在第二分钟结束时刻切换到频道一,每分钟产生愉悦度 ,然后直到结束。总共产生愉悦度 。
示例2
输入
3 4 17 8 3 0 10 9 10 7 15 0 6 16 9 14 8
输出
205
备注:
模拟
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) typedef long long ll; struct node { int u,v,to; bool operator<(const node a) { return a.u>u; } }ans[100005],pos[100005]; int main() { int n,m,t; scanf("%d%d%d",&n,&m,&t); for(int i=0;i<n;i++) scanf("%d%d",&ans[i].u,&ans[i].v); sort(ans,ans+n); for(int i=0;i<n;i++) { if(i==n-1) ans[i].to=t; else ans[i].to=ans[i+1].u; } for(int i=0;i<m;i++) scanf("%d%d",&pos[i].u,&pos[i].v); sort(pos,pos+m); for(int i=0;i<m;i++) { if(i==m-1) pos[i].to=t; else pos[i].to=pos[i+1].u; } int l=0,r=0,now=0; ll cnt=0,inf=0,top=0; while(1) { inf=max(ans[l].v,pos[r].v); top=min(ans[l].to,pos[r].to)-now; if(inf>0) cnt+=inf*top; now=min(ans[l].to,pos[r].to); if(now==ans[l].to) l++; if(now==pos[r].to) r++; if(now==t) break; } printf("%lld\n",cnt); return 0; }
J:美
题目描述
最后,Sεlιнα(Selina) 开始了选美大赛。 一如既往地,Sεlιнα 想最大化自己的愉悦度。她品味十分独特,对“美”有自己独到的见解。 她给每位经过层层选拔来到这一关的参赛男友都定义了一个帅气值 。Sεlιнα 需要将这些参赛者排成一排,她对于这个排列的“美”值的定义是:
其中 表示排列中第 个人的帅气值。特别地,当 时,有 。
她依旧想使自己获得最大的愉悦值,所以她要使这个排列的 值尽可能地大。聪明的你,快来告诉 Sεlιнα,这个最大的值是多少。
输入描述:
第一行一个整数 ,表示有 个男友。
第二行 个整数,第 个数表示值 。
输出描述:
输出共一行,一个整数,表示最大的
值。
示例1
输入
5 7 3 15 12 8
输出
34
示例2
输入
7 -2 0 8 9 -5 3 10
输出
68
备注:
贪心思想,两个大的之间插入个小的
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) #define ll long long ll a[200005],b[200005],n; ll ans=0; int main() { scanf("%lld",&n); for(int i=0;i<n;i++) { scanf("%lld",&a[i]); } sort(a,a+n); int l=0,r=n-1; for(int i=0;i<n;i++) { if(i&1) b[i]=a[l++]; else b[i]=a[r--]; } for(int i=0;i<n;i++) { if(i==0) ans+=abs(b[i]-b[n-1]); else ans+=abs(b[i]-b[i-1]); } printf("%lld\n",ans); return 0; }