Educational Codeforces Round 21 A-E题题解
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题题解的更多相关文章
- Educational Codeforces Round 21
Educational Codeforces Round 21 A. Lucky Year 个位数直接输出\(1\) 否则,假设\(n\)十进制最高位的值为\(s\),答案就是\(s-(n\mod ...
- 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 ...
- Educational Codeforces Round 21 Problem A - C
Problem A Lucky Year 题目传送门[here] 题目大意是说,只有一个数字非零的数是幸运的,给出一个数,求下一个幸运的数是多少. 这个幸运的数不是最高位的数字都是零,于是只跟最高位有 ...
- Educational Codeforces Round 37-F.SUM and REPLACE题解
一.题目 二.题目链接 http://codeforces.com/contest/920/problem/F 三.题意 给定$N$个范围在$[1, 1e6)$的数字和$M$个操作.操作有两种类型: ...
- 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 ...
- 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 ...
- Educational Codeforces Round 21 Problem E(Codeforces 808E) - 动态规划 - 贪心
After several latest reforms many tourists are planning to visit Berland, and Berland people underst ...
- Educational Codeforces Round 37-G.List Of Integers题解
一.题目 二.题目链接 http://codeforces.com/contest/920/problem/G 三.题意 给定一个$t$,表示有t次查询.每次查询给定一个$x$, $p$, $k$,需 ...
- CF Educational Codeforces Round 21
A. Lucky Year time limit per test 1 second memory limit per test 256 megabytes input standard input ...
随机推荐
- Hibernate SQLQuery 原生SQL 查询及返回结果集处理-2
1. 返回List, .setResultTransformer( Transformers.ALIAS_TO_ENTITY_MAP);将结果转为Map,存放到list中,即list中为若干 ...
- Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
This semester I'm teaching from Hastie, Tibshirani, and Friedman's book, The Elements of Statistical ...
- PHP数组简介
一.PHP数组的分类 按照下标的不同,PHP中的数组分为关联数组和索引数组:索引数组:下标从0开始,依次增长. $arr=[1,2,3,4,5]; 关联数组:下标为字符串格式,每个下标字符串与数组的值 ...
- 【小练习05】HTML+CSS--淘宝商铺小页面
要求实现如下效果图: 代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- BUGKUctf-web-writeup
---恢复内容开始--- 找到了个ctf平台.里面的web挺多的.终于将web题目写的差不多了. Web 签到题 加群就可以了 Web2 直接F12就看到了 文件上传测试 Burp抓包 文件名改成 1 ...
- javascript的八张图
- JavaScript面向对象轻松入门之抽象(demo by ES5、ES6、TypeScript)
抽象的概念 狭义的抽象,也就是代码里的抽象,就是把一些相关联的业务逻辑分离成属性和方法(行为),这些属性和方法就可以构成一个对象. 这种抽象是为了把难以理解的代码归纳成与现实世界关联的概念,比如小狗这 ...
- SQLServer 理解copyonly备份操作
标签:MSSQL/日志截断 概述 Alwayson在添加数据库的过程中如果同步首选项选择的是“完整”,那么就会在主副本上执行copyonly的完整备份和日志备份在辅助副本上执行还原操作,也正是这个操作 ...
- C++11 单例类实现
单例类: (1) 单例类保证全局只有一个唯一的实例对象. (2) 单例类保证只有唯一的接口获取这唯一实例. 非线程安全的单例类举例: class CSingleton { public: ~CSing ...
- flask 扩展之 -- flask-mail
Flask-Mail 封装了 python 标准库 smtplib 包, 以便于更好的与 Flask 集成. 一. 安装 $ pip install flask-mail 二. 配置 及 初始化 Fl ...