牛客小白月赛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?'
':' ');
        }
    }
    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
",x2,y1);
        else if(y2==y3)printf("%.8lf %.8lf
",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
",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
");
        else printf("Kun
");
    }
    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
");
        else printf("Xun
");
    }
    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
",(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
",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
",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
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/8908183.html