注:fjutoj基本每周都有一次周赛,欢迎大家都来参加!

网址:http://59.77.139.92/ 或 acm.fjut.edu.cn

A题

题意:一年中,每个月有可能亏x 元,有可能赚y 元,每连续的五个月加起来都亏钱,问一年最多赚多少钱,如果不能赚钱,输出"Deficit"。

思路:

  贪心的思路,五个月中亏钱的月份放后面去,并且使得五个月加起来亏钱最少,因此共有4种情况:

  x y y y y x y y y y x y

  x x y y y x x y y y x x

  x x x y y x x x y y x x

  x x x x y x x x x y x x

  用if判断一下即可

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<set>
#include<map>
#include<list>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define lson rt<<1
#define rson rt<<1|1
#define N 100010
#define M 100010
#define Mod 1000000007
#define LL long long
#define INF 0x7fffffff
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
#define For(i,f_start,f_end) for(int i=f_start;i<f_end;i++)
#define REP(i,f_end,f_start) for(int i=f_end;i>=f_start;i--)
#define Rep(i,f_end,f_start) for(int i=f_end;i>f_start;i--)
#define MT(x,i) memset(x,i,sizeof(x))
#define gcd(x,y) __gcd(x,y)
const double PI = acos(-); int main()
{
int x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
if(x>=*y) printf("Deficit\n");
else if(*x>*y)
{
if(*x<=*y) printf("Deficit\n");
else printf("%d\n",*x-*y);
}
else if(*x>=*y)
{
if(*x<=*y) printf("Deficit\n");
else printf("%d\n",*x-*y);
}
else if(*x>=y)
{
if(*x<=*y) printf("Deficit\n");
else printf("%d\n",*x-*y);
}
else
{
if(*x<=*y) printf("Deficit\n");
else printf("%d\n",*x-*y);
}
}
return ;
}

A题AC代码

B题

题意:规定了两种日历的格式,给出第一个日历日期,要求转化成第二种。

思路:简单题,考验新生的代码实现能力,并不需要什么思路,略过。

 #include<stdio.h>
#include<map>
#include<string>
#include<iostream>
using namespace std; map<string, int> mp;
map<int, string> pm;
int main()
{
mp["pop"]=; mp["no"]=; mp["zip"]=;
mp["zotz"]=; mp["tzec"]=; mp["xul"]=;
mp["yoxkin"]=; mp["mol"]=; mp["chen"]=;
mp["yax"]=; mp["zac"]=; mp["ceh"]=;
mp["mac"]=; mp["kankin"]=; mp["muan"]=;
mp["pax"]=; mp["koyab"]=; mp["cumhu"]=;
mp["uayet"]=; pm[]="imix"; pm[]="ik"; pm[]="akbal"; pm[]="kan"; pm[]="chicchan"; pm[]="cimi";
pm[]="manik"; pm[]="lamat"; pm[]="muluk"; pm[]="ok"; pm[]="chuen"; pm[]="eb";
pm[]="ben"; pm[]="ix"; pm[]="mem"; pm[]="cib"; pm[]="caban"; pm[]="eznab";
pm[]="canac"; pm[]="ahau"; int t;
scanf("%d",&t);
printf("%d\n",t);
while(t--)
{
int day=, mon, year;
string tmp;
scanf("%d.",&day); cin>>tmp; scanf("%d",&year);
mon=mp[tmp];
day = year* + mon* + day;
year = day/;
mon = day%;
day = day%;
printf("%d ",day+); cout<<pm[mon]; printf(" %d\n",year);
}
return ;
}

B题AC代码

C题

题意:字符串比较,第一个字符串多包含了*、?,*可以替换为任意多个任意字符,?可以替换为1个任意字符。

思路:数据量大时,用AC自动机做,因为该题数据量小,所以是简单题,递归一下更方便

 #include<stdio.h>
using namespace std; char head[], s[];
bool dfs(int i, int j)
{
if(head[i]== && s[j]==) return true;
else if(head[i]==) return false;
else if(s[j]==)
{
for(;head[i]!= && head[i]=='*';i++);
if(head[i]!=) return false;
else return true;
}
if('a'<=head[i] && head[i]<='z')
{
if(s[i]!=head[j]) return false;
else return dfs(i+, j+);
}
else if(head[i]=='?') return dfs(i+, j+);
else
{
int k;
for(k=i;head[k];k++)
{
if(head[k]!='*') break;
}
if(head[k]==) return true;
bool ret=false;
for(;s[j] && !ret;j++)
{
ret=dfs(k, j);
}
return ret;
}
} int main()
{
while(~scanf("%s",head))
{
int n;
scanf("%d",&n);
int co=;
while(n--)
{
scanf("%s",s);
if(dfs(,)) co++;
}
printf("%d\n",co);
}
return ;
}

C题AC代码

D题

题意:有一个坐标系,坐标系上有n个点,在同一行或同一列上的任意两点称为关联的,并且关联属性是可传递的,即A和B关联,B和C关联,则可认为A和C关联,现在问图中是否任意两点都是关联的。

n>=2 && n<=50万

每个点的坐标x、y满足 1<=x、y<=50000

思路:并查集,横、纵坐标最多50000,可以先对所有点按横坐标排序,然后遍历一遍,如果两点横坐标相同,他们的纵坐标就是一组的。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 500010 int fa[N];
int find(int x)
{
int p=x;
while(p!=fa[p]) p=fa[p];
int q;
while(fa[x]!=p)
{
q=fa[x];
fa[x]=p;
x=q;
}
return p;
}
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy) fa[fx]=fy;
} struct Node
{
int x,y;
}v[N]; bool cmp(Node a,Node b)
{
if(a.x!=b.x) return a.x>b.x;
else return a.y<b.y;
} bool vis[N];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
scanf("%d%d",&v[i].x,&v[i].y);
if(v[i].y>) while();
vis[v[i].y]=;
}
for(int i=;i<=;i++) fa[i]=i;
sort(v,v+n,cmp);
int prex=-, prey=-;
for(int i=;i<n;i++)
{
if(v[i].x!=prex)
{
prex=v[i].x;
prey=v[i].y;
}
else
{
join(prey, v[i].y);
}
}
int co=;
for(int i=;i<=;i++)
{
if(vis[i])
{
if(fa[i]==i) co++;
}
}
if(co==) printf("YES\n");
else printf("NO\n");
}
return ;
}

D题AC代码

E题

题意:给n个数,有m次询问,每次询问提供一个区间[l,r],每次求一个x使得最小。

思路:划分树,基本是模板题了,略过。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 100010
#define LL long long
int sorted[N]; //排序好的数组
int num[][N]; //num[i] 表示i前面有多少个点进入左孩子
LL sum[][N];
int val[][N]; //20层,每一层元素排放,0层就是原数组
void build(int l,int r,int ceng)
{
if(l==r) return ;
int mid=(l+r)/,isame=mid-l+; //isame保存有多少和sorted[mid]一样大的数进入左孩子
for(int i=l;i<=r;i++) if(val[ceng][i]<sorted[mid]) isame--;
int ln=l,rn=mid+; //本结点两个孩子结点的开头,ln左
for(int i=l;i<=r;i++)
{
if(i==l) num[ceng][i]=, sum[ceng][i]=;
else num[ceng][i]=num[ceng][i-], sum[ceng][i]=sum[ceng][i-];
if(val[ceng][i]<sorted[mid] || val[ceng][i]==sorted[mid]&&isame>)
{
val[ceng+][ln++]=val[ceng][i];
num[ceng][i]++;
sum[ceng][i]+=val[ceng][i];
if(val[ceng][i]==sorted[mid]) isame--;
}
else
{
val[ceng+][rn++]=val[ceng][i];
}
}
build(l,mid,ceng+);
build(mid+,r,ceng+);
}
LL ans;
LL look(int ceng,int sl,int sr,int l,int r,int k,LL he)
{
if(sl==sr) return val[ceng][sl];
int ly; LL sy;
if(l==sl) ly=,sy=;
else ly=num[ceng][l-],sy=sum[ceng][l-];
int tolef=num[ceng][r]-ly;
LL ret;
if(tolef>=k)
{
ret = look(ceng+,sl,(sl+sr)/,sl+ly,sl+num[ceng][r]-,k,sum[ceng][r]-sy);
ans += (he-sum[ceng][r]+sy)-ret*(r-l+-tolef);
}
else
{
int lr = (sl+sr)/ + + (l-sl-ly);
ret = look(ceng+,(sl+sr)/+,sr,lr,lr+r-l+-tolef-,k-tolef,he-sum[ceng][r]+sy);
ans += ret*tolef-sum[ceng][r]+sy;
}
return ret;
} LL pre[N];
int main()
{
int cas=,t,n,m,l,r;
scanf("%d",&t);
while(t--)
{
printf("Case #%d:\n",cas++);
scanf("%d",&n);
pre[]=;
for(int i=;i<=n;i++)
{
scanf("%d",&val[][i]);
sorted[i]=val[][i];
pre[i]=pre[i-]+val[][i];
}
sort(sorted+,sorted+n+);
build(,n,);
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&l,&r);
l++, r++;
ans=;
look(,,n,l,r,(r-l+)/,pre[r]-pre[l-]);
printf("%I64d\n",ans);
}
printf("\n");
}
return ;
}

E题AC代码

总结:A题考逻辑能力,B题考代码能力,C题需要更高的代码能力,D题考简单的数据结构,E题考知识面。

FJUTOJ-周赛2016-11-25的更多相关文章

  1. 2016.11.25 activiti的配置文件解析

    参考来自activiti的用户手册.   activiti的配置文件解析 1.processEngine的配置 注意,单独创建流程引擎与spring方式创建流程引擎是不一样的,区别在于:process ...

  2. 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理

    2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...

  3. U3D笔记11:47 2016/11/30-15:15 2016/12/19

    11:47 2016/11/30Before you can load a level you have to add it to the list of levels used in the gam ...

  4. 微信iphone7、 ios10播放视频解决方案 2016.11.10

    2016.11.10日更新以下方法 微信最新出同层播放规范 即使是官方的也无法解决所有android手机的问题. 另外iphone 5 .5s 某些手机始终会弹出播放,请继续采用 “以下是老的解决办法 ...

  5. 最新的 cocoapods 安装与使用(2016.11)

    cocoapods简介: cocoapods 是iOS的类库管理工具,可以让开发者很方便集成各种第三方库,而不用去网站上一个个下载,再一个个文件夹的拖进项目中,还得添加相关的系统依赖库.只需要安装好c ...

  6. 【转载】webstorm11(注册,激活,破解,码,一起支持正版,最新可用)(2016.11.16更新)

    很多人都发现 http://idea.lanyus.com/ 不能激活了 很多帖子说的 http://15.idea.lanyus.com/ 之类都用不了了 最近封的厉害仅作测试 选择 License ...

  7. 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

    作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09     据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...

  8. github javascript相关项目star数排行榜(前30,截止2016.11.18):

    github javascript相关项目star数排行榜(前30,截止2016.11.18): 前端开源框架 TOP 100 前端 TOP 100:::::https://www.awesomes. ...

  9. 2016/11/10 吃吃喝喝Hacking Thursday Night聚餐活动 at Dunkin Donuts

    店名:Dunkin Donuts 唐恩都乐 点评:http://www.dianping.com/shop/21378231 地址:静安区南京西路1649号静安公园内(近静安公园) 走法:地铁2号线静 ...

  10. 2018.11.25 AMC-ICPC 亚洲区域赛(焦作站)吊银

    11月23日 大清早,跟着wyb的脚步,早起跑过去听方伟的编译原理,然鹅一点都没听进去,在焦作胡辣汤群里疯狂灌水... 听说焦作那边冷得不行,前一天看天气预报说那边已经是2℃了,都快零下了,然鹅学校里 ...

随机推荐

  1. C# 操作Excel图形——绘制、读取、隐藏、删除图形

    简介 本篇文章将介绍C# 如何处理Excel图形相关的问题,包括以下内容要点: 1.绘制图形 1.1 绘制图形并添加文本到图形 1.2 添加图片到图形 1.3 设置图形阴影效果 1.4 设置图形透明度 ...

  2. C# 如何添加Excel页眉页脚(图片、文字、奇偶页不同)

    简介 我们可以通过代码编程来对Excel工作表实现很多操作,在下面的示例中,将介绍如何来添加Excel页眉.页脚.在页眉处,我们可以添加文字,如公司名称.页码.工作表名.日期等,也可以添加图片,如LO ...

  3. JavaScript大师必须掌握的12个知识点

    既然你对这篇文章感兴趣,我想你应该是一位前端开发,也许你有一份不错的工作.自主创业甚至是一位自由从业者.不知你的前端技术如何,也许你是一位新手,亦或是一位资深开发. 如果你想让自己成为一个 JavaS ...

  4. wordcloud2.js

    https://blogs.msdn.microsoft.com/dotnet/2019/01/10/announcing-ml-net-0-9-machine-learning-for-net/ h ...

  5. dsu on tree入门

    先瞎扯几句 说起来我跟这个算法好像还有很深的渊源呢qwq.当时在学业水平考试的考场上,题目都做完了不会做,于是开始xjb出题.突然我想到这么一个题 看起来好像很可做的样子,然而直到考试完我都只想出来一 ...

  6. My MES思路图

  7. C#设置电脑时间帮助类

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  8. 腾讯云服务器 ubuntu 设置允许root用户登录

    背景:最近购买了腾讯云服务器,使用了Ubuntu Server 14.04.1 LTS 64位操作系统,腾讯云主机ubuntu系统默认用户名为ubuntu,登录服务器时每一次都是以默认账号ubuntu ...

  9. 播放器的书签--推荐使用Potplayer

    VLC Player https://www.vlchelp.com/skipping-and-playing-audio-and-video-portions-in-vlc/ PotPlayer  ...

  10. 二、Windows Server 2016 AD 组织单位、组、用户的创建

    简介: 组织单位简称OU,OU是(Organizational Unit)的缩写,组织单位是可以将用户.组.计算机和组织单位放入其中的容器.是可以指派组策略设置或委派管理权限的最小作用域或单元. 建立 ...