这次周赛题目拉了CF315和CF349两套题。

因为我代码模板较长,便只放出关键代码部分

#define ll long long

#define MMT(s,a) memset(s, a, sizeof s)
#define GO(i,a,b) for(int i = (a); i < (b); ++i)
#define GOE(i,a,b) for(int i = (a); i <= (b); ++i)
#define OG(i,a,b) for(int i = (a); i > (b); --i)
#define OGE(i,a,b) for(int i = (a); i >= (b); --i)

这是代码中的几个宏定义,需要拿代码修改这个几个就行了,若是用到代码其他定义部分,会在代码中额外添加。

这里也只是部分题解。


A - Cinema Line (CF-349A)

题意很简单,就是说你是售票员,门票价格25元,有n个人来买票,钱只有25,50,100三种,最开始你没有钱,问你是否可以完成售票过程,即每个人都有足够的零钱找他,按顺序购票。

题目思路模拟即可。

 int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
int n,a,flag = ,tot1 = ,tot2 = ,tot3 = ;
cin>>n;
GO(i,,n){
cin>>a;
if(a == ){
tot1++;
}
else if(a == ){
if(tot1 > ){
tot1--;
tot2++;
}
else
flag = ;
}
else if(a == ){
if(tot2 > && tot1 > ){
tot2--,tot1--;
tot3++;
}
else if(tot1 > ){
tot1-=;
tot3++;
}
else
flag = ;
}
}
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
return ;
}

B - Color the Fence (CF-349B)

题目意思就是最开始有n,然后选取第i个数就需要花费a[i],问最大能够成的数。

题目思路:首先需要保证位数最大,所以先找到最小值min,n/min即为最大位数,然后对于每一位,从9-1往回找输出。值得注意的是,可能你选取某个数会使得位数减少,所以选取数还得判断是否会影响位数。双重循环贪心。

 int n,a[] = {};
int flag = ,ii; int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
cin>>n;
int minn = INT_MAX;
GOE(i,,){
cin>>a[i];
if(a[i] < minn)
minn = a[i];
}
if(minn > n){
cout << - << endl;
return ;
}
int cnt = n / minn;
OGE(i,cnt,){
OGE(j,,){
if(n >= a[j] && (n-a[j]) / minn >= i-){
cout << j;
n -= a[j];
break;
}
}
}
cout << endl;
return ;
}

C - Mafia(CF-349C)

题目意思就是n个人进行Mafia的游戏,游戏规则就是选取一个人当裁判(类似狼人杀),其他n-1个人进行游戏,如果某人某局为裁判,则不计入他的游戏对局数。问要保证每个人i都玩了a[i]局游戏。

题目思路:首先要保证最大值max = max(a[i])玩完,所以游戏至少要玩max轮,在这max轮对局中,当某个人玩成了他的a[i]局,那么剩下的max-a[i]局他就可以当裁判为其他人服务。

所以令sum = Σ(max - a[i])。

当sum >= max时,说明有足够的轮数可以让非最大值的人当裁判去完成最大值的max轮,这种情况只需要玩max局即可。

当sum < max时,则需要额外的轮数让其他人为最大值的人当裁判,而每一轮有n-1个人可以当裁判。这种情况就玩(max - sum)/(n-1)+max即可。

同理这道题也可以二分,因为每局都有n-1个人可以当裁判为剩下的一个人服务。那么则从max —— Σ(a[i])二分选取cnt*(n-1) >= sum即可。

 int a[];

 int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
int n,maxx = INT_MIN;
ll sum = ;
cin>>n;
GO(i,,n){
cin>>a[i];
maxx = max(a[i],maxx);
}
GO(i,,n)
sum += maxx - a[i];
if(sum >= maxx)
cout << maxx << endl;
else{
int cnt = ;
while(sum < maxx){
cnt++;
sum += n-;
}
cout << maxx+cnt << endl;
} return ;
}

D - Apple Tree(CF-349D)

题意就是有一颗苹果树,根节点为1,然后保证非叶子节点的值都是0(就是树枝上不会有苹果,很好理解),叶子节点的值是a[i],然后现在要使这颗树变得平衡,平衡的定义为,每个非叶子节点的所有子节点值相同(就是说某个树杈的所有树枝包含的苹果相同)。

题目思路:对于每一个结点u,要知道它的总分支数r[u]及现在所拥有的权值和val[u],因为不同子树总分支数不一定相同,故结点u每次减少的值需要是其所有子树分支的最小公倍数,而且对于u的子树也需要保证平衡,故u点每次需减去的值 = lcm * 儿子个数,值得注意的是lcm可能会爆long long,这种情况我们可以认为这个树平衡当且仅当所有的苹果都被拿走,即全部去掉。

那么对于任意一个节点,先计算这个节点可拿走的苹果数,再计算苹果数目的上界,贪心选取最大重量更新节点情况。

代码还有额外的宏定义

#define PB push_back

const ll INFF = 0x3f3f3f3f3f3f3f3f;

template<typename T>
inline T gcd(T a, T b){ return b==0 ? a : gcd(b,a%b); }
template<typename T>
inline T lcm(T a, T b){ if(a*b > INFF) return 0; return a / gcd(a,b) * b; }

 const int maxn = <<;

 ll v[maxn],dp[maxn],dis[maxn];
ll sum = ;
vector<int> Edge[maxn];
bool flag; void Add(int l,int r){
Edge[l].PB(r);
Edge[r].PB(l);
} void dfs(int st,int fa){
dp[st] = v[st],dis[st] = ;
int cnt = ;
for(auto it : Edge[st]){
if(it == fa)
continue;
cnt++;
dfs(it,st);
int temp = lcm(dis[st],dis[it]);
if(temp)
dis[st] = temp;
else
dis[st] = , flag = ;
dp[st] += dp[it];
}
for(auto it : Edge[st]){
if(it == fa)
continue;
dp[st] = min(dp[st],dp[it] - dp[it]%dis[st]);
}
(cnt == ) && cnt++;
dp[st] *= cnt, dis[st] *= cnt;
} int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
int n,l,r;
cin>>n;
GOE(i,,n){
cin>>v[i];
sum += v[i];
}
GO(i,,n){
cin>>l>>r;
Add(l,r);
}
flag = ;
dfs(,);
if(!flag)
cout << sum << endl;
else
cout << sum - dp[] << endl; return ;
}

F - Sereja and Bottles(CF-315A)

题意就是n个瓶子,a[i]瓶可以打开其他的第b[i]瓶,问最后剩下多少瓶子没有打开。

题目思路:标记模拟即可

 int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
int n,cnt();
int a[],b[],vis[] = {};
cin>>n;
GOE(i,,n)
cin>>a[i]>>b[i];
GOE(i,,n){
GOE(j,,n){
if(i != j && a[j] == b[i])
vis[j] = ;
}
}
GOE(i,,n){
if(vis[i])
cnt++;
}
cout << n - cnt << endl; return ;
}

G - Sereja and Array(CF-315B)

题意就是三种操作.

1 就是把第x个元素变成v;

2 就是把所有元素加上v;

3 即使输出第x个元素的值;

题目思路:1,3操作容易实现,主要是2操作,总不能遍历把每个值加上v,因为题目说了是所有值加上v,所以只需要用一个数记录v的和,输出是加上这个就行,同时需要因为有1操作,所以还需要开额外一个数组记录当某个值改变时,存取当前的v总和,输出再减去这个值即可。

 int n,m,temp = ;
int a[],dis[];
int x,y,z; int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
cin>>n>>m;
GOE(i,,n)
cin>>a[i];
GO(i,,m){
cin>>x;
if(x == ){
cin>>y>>z;
dis[y] = temp;
a[y] = z;
}
else if(x == ){
cin>>y;
temp += y;
}
else if(x == ){
cin>>y;
cout << a[y] + temp - dis[y] << endl;
}
} return ;
}

H - Sereja and Contest(CF-315C)

题意就是有n个数字,当f(a[i])小于k时删除这个数,输出其位置,再从新计算。

f(i) = Σ(a[j]*(j-1) - (n-i)*a[i]);

题目思路:第一轮删除了a[i],那么下一轮删除的数的位置,一定时大于i的。

这个公式可以变成(j-1)* Σ(a[j]) - (j-1)*(n-i)*a[i],可以发现前半部分就是一个前缀和,所以过程中维护n的大小动态修改。

 int n,k;
ll a[]; int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
cin>>n>>k;
GOE(i,,n)
cin>>a[i];
ll now(),tot(),temp(n);
GOE(i,,n){
now += a[i-]*tot;
if(now - (temp-i+(n-temp))*a[i]*(i--(n-temp)) < k){
temp--;
now -= a[i]*tot;
cout << i << endl;
}
else
tot++;
}
return ;
}

I - Sereja and Periods(CF-315D)

题目意思就是两个串分别是[a,b],[c,d],运算规则就是b个a相连接,例如[abc,2] = abcabc;

然后问你[a,b]这个串中出现了几次[c,d]。

题目思路:KMP找循环节。用cnt[i]记录当前开始以c串的i位置找,经过一个a串后,会经过几个c串,nxt记录当前开始以c串的i位置开始找,经过一个a串后,匹配的位置会到什么地方。每次对于a串都是从0~lena找,因为走完一个a串后,下一条又从0开始了。

1e7,单层循环,没问题。

 int b,d,cnt[] = {},nxt[];
string a,c; int main(){
ios_base::sync_with_stdio(false), cout.tie(), cin.tie();
cin>>b>>d>>a>>c;
int lenc = c.size(),lena = a.size();
GO(i,,lenc){
int temp = i;
GO(j,,lena){
if(a[j] == c[temp]){
temp++;
if(temp == lenc)
cnt[i]++, temp = ;
}
}
nxt[i] = temp;
}
int j = ;
ll sum = ;
GOE(i,,b){
sum += cnt[j];
j = nxt[j];
}
cout << sum/d << endl; return ;
}

暂时只补了这么多题目。太难了暂时还补不了,望谅解。

ACM团队周赛题解(1)的更多相关文章

  1. ACM团队周赛题解(3)

    940和822两套div.2 老规矩 #define MAXN 1000000+5#define MOD 1000000007#define PI (acos(-1.0))#define EPS 1e ...

  2. ACM团队周赛题解(2)

    拉了CF583和CF486的两套div2题目 还是先贴宏定义部分 #define MAXN 1000000+5#define MOD 1000000007#define PI (acos(-1.0)) ...

  3. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  4. ACM团队招新赛题解

    标程代码全部为C语言编写.代码中的#if LOCAL_ 至#endif为本地一些调试内容,可以忽略. Xenny的A+B(1)[容易][签到] 签到题,做不出的话可能你有点不太适合ACM了. Xenn ...

  5. SUST_ACM_2019届暑期ACM集训热身赛题解

    问题A:Hello SUST! 知识点:基本输入输出 C/C++: #include <stdio.h> int main() { int n; scanf("%d", ...

  6. FJUT2019暑假第二次周赛题解

    A 服务器维护 题目大意: 给出时间段[S,E],这段时间需要人维护服务器,给出n个小时间段[ai,bi],代表每个人会维护的时间段,每个人维护这段时间有一个花费,现在问题就是维护服务器[S,E]这段 ...

  7. 「POJ3436」ACM Computer Factory题解

    题意: 有很多台机器,可以把物件从一种状态改装成另一种状态,初始全为\(0\),最终状态全为\(1\),让你可以拼凑机器,请问最大总性能为多少,且要求输出方案. 题解: 这道题是真的水啊,我不想写太多 ...

  8. ACM: 限时训练题解-Runtime Error-二分查找

    Runtime Error   Bahosain was trying to solve this simple problem, but he got a Runtime Error on one ...

  9. ACM: 限时训练题解-Heavy Coins-枚举子集-暴力枚举

    Heavy Coins   Bahosain has a lot of coins in his pocket. These coins are really heavy, so he always ...

随机推荐

  1. vSphere Web Client 监控 esxi 主机硬件状态

    开启插件能对 vcenter 管理的 esxi 主机的硬件状态进行监控. 以下操作均在 vcenter 主机上操作. 0x00 修改配置 文档中关于启用脚本插件支持的说明: Enabling Scri ...

  2. 自己实现spring核心功能 二

    前言 上一篇我们讲了spring的一些特点并且分析了需要实现哪些功能,已经把准备工作都做完了,这一篇我们开始实现具体功能. 容器加载过程 我们知道,在spring中refesh()方法做了很多初始化的 ...

  3. vue 异步加载远程组件(支持编译less语法)

    本代码已组件化,可以直接使用. 说明:本组件可以直接解析.vue文件,为了支持less语法解析,在组件中引入less.js,可在less官网下载. 组件代码 <template> < ...

  4. 小白学Python(2)——常用Python编程工具,Python IDE

    下载好Python,但是如何开始编程呢? 有几种方法, 1.第一个就是command lind 即为命令行的方式,也就是我们常说的cmd. 输入 win+ cmd 在命令行中再输入 python,即可 ...

  5. web 前端开发学习路线

    初级 HTML 5 HTML 5 与 HTML 4 的区别 HTML 5 新增的主体结构元素 HTML 5 新增的非主体结构元素 HTML 5 表单新增元素与属性 HTML 5 表单新增元素与属性(续 ...

  6. JavaScript数组方法大全(第一篇)

    数组方法大全(第一篇) 注意:第一次写博客有点小紧张,如有错误欢迎指出,如有雷同纯属巧合,本次总结参考书籍JavaScript权威指南,有兴趣的小伙伴可以去翻阅一下哦 join()方法 该方法是将数组 ...

  7. Spring中jdbcTemplate的用法实例

    一.首先配置JdbcTemplate: 要使用Jdbctemplate 对象来完成jdbc 操作.通常情况下,有三种种方式得到JdbcTemplate 对象.       第一种方式:我们可以在自己定 ...

  8. python 06 深浅拷贝

    目录 1. 小数据池 1.1 代码块 1.2 小数据池 1.3 执行顺序 (代码块--小数据池) 1.4 "=="和 "is" 2. 深浅拷贝 2.1 赋值 2 ...

  9. jq ajax传递json对象到服务端及contentType的用法

    目录 0.一般情况下,通过键值对的方式将参数传递到服务端 1.ajax 传递复杂json对象到服务端 2.content-Type 对asp.net mvc项目的重要性 0.一般情况下,通过键值对的方 ...

  10. 第一个Javaweb应用程序

    第一个Javaweb应用程序 一.Javaweb应用程序结构 一个 web 应用程序是由一组 Servlet,HTML 页面,类,以及其它的资源组成的运行在 web 服务器上的完整的应用程序,以一种结 ...