A题      ............太水就不说了,贴下代码

#include<string>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
int n,m;
int main()
{
int i,j;
scanf("%d",&n);
int nn=n;
int cnt=;
while(nn>=)
{
nn/=;
cnt*=;
}
printf("%d\n",cnt*(nn+)-n);
}

B题    开始没看懂题什么意思(英语渣),然后看着样例找到了规律,就AC了

     题意是计算上升和下降的序列数之和,再除以n-k+1即可,相当于求其中每k个数的和的平均值!

#include<string>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
int n,m,k;
double arr[];
double sum[];
int main()
{
int i,j;
scanf("%d%d",&n,&k);
for(i=;i<=n;i++)scanf("%lf",&arr[i]);
sum[]=;
for(i=;i<=n;i++)sum[i]=sum[i-]+arr[i];
double ans=;
for(i=;i+k<=n;i++)
{
ans+=sum[i+k]-sum[i];
}
ans/=((n-k+));
printf("%.10f\n",ans);
}

C 题     题目的意思是主人有n个茶杯,每个茶杯有容量。现在给一壶茶,总量为w。希望倒茶满足条件:每杯茶要超过容量的一半,并且w被倒光,茶杯内的茶水为整数,容量大的杯子内的茶不允许比容量小的杯子内的茶水少。

先给每个茶杯倒一半的水,然后把剩下的水尽量倒到容量大的茶杯里,倒完为止

#include<string>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
int n,m,w;
int arr[];
typedef struct node
{
int id,val,lim;
friend bool operator<(node a,node b){return a.lim<b.lim;}
}node;
node axx[];
int main()
{
int i,j;
scanf("%d%d",&n,&w);
int lim=;
for(i=;i<n;i++)
{
scanf("%d",&arr[i]);
lim+=(arr[i]+)/;
}
if(w<lim)printf("-1\n");
else
{
w-=lim;
for(i=;i<n;i++)axx[i].id=i,axx[i].val=(arr[i]+)/,axx[i].lim=arr[i];
sort(axx,axx+n);
for(i=n-;i>=&&w>;i--)while(axx[i].lim>axx[i].val&&w>)axx[i].val++,w--;
for(i=;i<n;i++)arr[axx[i].id]=axx[i].val;
for(i=;i<n;i++)
{
if(i)printf(" ");
printf("%d",arr[i]);
}
printf("\n");
}
}

D 题    给你一个序列ai,首先你可以让序列中的一个数移动到这个序列的任何一个位置,然后让你求是否存在一个前缀,使得前缀和等于序列中其余的数的和

解法:扫一遍求前缀和,扫x时有三种情况是yes,第一,1~x的前缀和恰好等于序列总和的一半;第二,存在前缀序列中某一个数跳到了后缀里,使得新的前缀和满足条件,

即(1~x+1前缀和-跳出去的数的值)=序列总和的一半;第三,存在后缀序列中某一个数跳到了前缀里,使得新的前缀和满足条件,即(1~x-1前缀和+跳进来的数的值)=序列总和的一半,

只要用map来维护前缀和后缀中存在的数即可

#include<string>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
#include<map>
using namespace std;
typedef long long ll;
int n,m;
ll arr[];
ll sum[];
map<ll,int>dui1,dui2;
int main()
{
int i,j;
scanf("%d",&n);
for(i=;i<=n;i++)scanf("%I64d",&arr[i]);
dui1.clear();
dui2.clear();
sum[]=;
for(i=;i<=n;i++)sum[i]=sum[i-]+arr[i];
if(sum[n]&)
{
printf("NO\n");
}
else
{
for(i=;i<=n;i++)
{
if(!dui2.count(arr[i]))dui2[arr[i]]=;
else dui2[arr[i]]++;
}
for(i=;i<n;i++)
{
dui1[arr[i]]=;
dui2[arr[i]]--;
if(sum[i]==sum[n]/)
{
printf("YES\n");
return ;
}
else if(dui1.count(arr[i+]+sum[i]-sum[n]/))
{
printf("YES\n");
return ;
}
else if(dui2[-sum[i]+arr[i]+sum[n]/]>)
{
printf("YES\n");
return ;
}
}
printf("NO\n");
}
return ;
}

E题   题意是一个01背包,坏消息是n<=100000,m<=300000,好消息是w=1,2,3...这个题直接O(nm)去做肯定不行,模拟比赛的时候我心存侥幸大范围贪心,小范围dp,然后果断WA了....

正解是三分法,首先我们把物品以w=1,2,3分类,然后分别排序,并求出前缀和,然后枚举取用w=3的物品的个数,然后 三分2的个数, 1的个数也就知道了 。而2的个数和是一个单峰函数,

所以可以用三分法

#include<string>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstdio>
#include<set>
using namespace std;
typedef long long ll;
vector<ll>arr[];
ll sum[][];
ll n,m;
bool cmp(ll a,ll b){return a>b;}
ll getans(ll tri,ll dob){return sum[][tri]+sum[][dob]+sum[][m-tri*-dob*];}
int main()
{
ll i,j;
scanf("%d%d",&n,&m);
for(i=;i<n;i++)
{
ll w;
ll val;
scanf("%I64d%I64d",&w,&val);
arr[w].push_back(val);
}
for(i=;i<=;i++)sort(arr[i].begin(),arr[i].end(),cmp);
for(i=;i<=;i++)
{
sum[i][]=;
for(j=;j<=arr[i].size();j++)sum[i][j]=sum[i][j-]+arr[i][j-];
for(j=arr[i].size()+;j<=m;j++)sum[i][j]=sum[i][j-];
}
ll maxn=;
for(i=;i<=arr[].size();i++)
{
if(*i>m)break;
ll l=,r=(m-*i)/;
while(r-l>)
{
ll rmid=(r*+l)/;
ll lmid=(l*+r)/;
ll ans1=getans(i,lmid);
ll ans2=getans(i,rmid);
if(ans1>ans2)r=rmid;
else l=lmid;
maxn=max(maxn,ans1);
maxn=max(maxn,ans2);
}
for(j=l;j<=r;j++)maxn=max(getans(i,j),maxn);
//printf("%I64d\n",maxn);
}
printf("%I64d\n",maxn);
return ;
}

Educational Codeforces Round 21 A-E题题解的更多相关文章

  1. Educational Codeforces Round 21

    Educational Codeforces Round 21  A. Lucky Year 个位数直接输出\(1\) 否则,假设\(n\)十进制最高位的值为\(s\),答案就是\(s-(n\mod ...

  2. Educational Codeforces Round 21 Problem D(Codeforces 808D)

    Vasya has an array a consisting of positive integer numbers. Vasya wants to divide this array into t ...

  3. Educational Codeforces Round 21 Problem A - C

    Problem A Lucky Year 题目传送门[here] 题目大意是说,只有一个数字非零的数是幸运的,给出一个数,求下一个幸运的数是多少. 这个幸运的数不是最高位的数字都是零,于是只跟最高位有 ...

  4. Educational Codeforces Round 37-F.SUM and REPLACE题解

    一.题目 二.题目链接 http://codeforces.com/contest/920/problem/F 三.题意 给定$N$个范围在$[1, 1e6)$的数字和$M$个操作.操作有两种类型: ...

  5. Educational Codeforces Round 21 D.Array Division(二分)

    D. Array Division time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  6. Educational Codeforces Round 21(A.暴力,B.前缀和,C.贪心)

    A. Lucky Year time limit per test:1 second memory limit per test:256 megabytes input:standard input ...

  7. Educational Codeforces Round 21 Problem E(Codeforces 808E) - 动态规划 - 贪心

    After several latest reforms many tourists are planning to visit Berland, and Berland people underst ...

  8. Educational Codeforces Round 37-G.List Of Integers题解

    一.题目 二.题目链接 http://codeforces.com/contest/920/problem/G 三.题意 给定一个$t$,表示有t次查询.每次查询给定一个$x$, $p$, $k$,需 ...

  9. CF Educational Codeforces Round 21

    A. Lucky Year time limit per test 1 second memory limit per test 256 megabytes input standard input ...

随机推荐

  1. 决策树模型比较:C4.5,CART,CHAID,QUEST

    (1)C4.5算法的特点为: 输入变量(自变量):为分类型变量或连续型变量. 输出变量(目标变量):为分类型变量. 连续变量处理:N等分离散化. 树分枝类型:多分枝. 分裂指标:信息增益比率gain ...

  2. JS中Node节点总结

    Node的三个基本属性: 1.nodeType:表明节点类型,1是元素节点,3是文本节点. 2.nodeName:  表明节点名称,元素节点为标签名,文本节点为#text. 3.nodeValue:表 ...

  3. Flex 布局:语法篇

    网页布局(layout)是 CSS 的一个重点应用.布局的传统解决方案,基于盒状模型,依赖 display 属性 + position 属性 + float 属性.它对于那些特殊布局非常不方便,比如, ...

  4. 跟着刚哥深入学maven

    前言:目前所有的项目都在使用maven,可是一直没有时间去整理学习,这两天正好有时间,好好的整理一下. 一.为什么使用Maven这样的构建工具[why] ① 一个项目就是一个工程 如果项目非常庞大,就 ...

  5. JVM-3.内存

    目录 一.运行时数据区 二.内存使用细节:以HotSpot的堆为例 三.实战:OutOfMemoryError异常 四.垃圾收集器(堆+方法区)与内存分配策略       一.运行时数据区 1.程序计 ...

  6. 读书笔记-你不知道的JavaScript(上)

    本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...

  7. Dede CMS如何在文章中增加“附件下载”操作说明

    1.进入后台--在"附件管理"中选择"上传新文件" 2.在"说明标题"输入要上传文件的名字,并在下面浏览找到要上传的文件,保存. 3.在&q ...

  8. Ajax&jQuery教案总结

    Ajax&jQuery教程总结 目录 第一章 Ajax入门 6 第1讲 传统表单提交存在的问题 6 课程内容 6 1. 问题的引入 6 2. 问题的解决 6 参考进度(0.5课时) 7 第2讲 ...

  9. iter迭代器的应用

    迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 用户不用关心迭代器的内部结构,仅需通过next方法不断去读取下一个内容 不能随机访问任意一个内容,只 ...

  10. Java基础知识总结之IO流

    理解Java的IO流 流(Stream)的概念:程序与数据来源之间的桥梁 流的分类 按流的方向来分(从程序所在的内存的角度来看): 输入流:把外部输入读入当前程序所在内. 输出流:把当前程序所在内存的 ...