清北冬令营入学测试[ABCDEF]
http://tyvj.cn/Contest/861
[1.2.2017]
像我这种蒟蒻只做了前6道还有道不会只拿了暴力分
A
描述 这是一道有背景的题目,小A也是一个有故事的人。但可惜的是这里纸张太小,小A无法把故事详细地说给大家听。可能小A自己也讲不清楚自己的故事,因为如果讲清了,也就没有这道题目了…… 小A的问题是这个样子,它找到了n份不同的工作,第i份工作每个月有ai的工资,每份工作需要小A每天工作8小时,一周工作7天。小A想知道性价比最高(一个月的工资除以总时长)的工作的编号是多少。如果有多份,输出编号最小的就可以了。 输入格式 第一行一个数n,表示有n份工作。 接下来n个数表示ai。 输出格式 输出一个数表示答案。 备注 输入样例 输出样例 数据范围 对于100%的数据n<=,<=ai<=。
题目
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,a,mx=-INF,mxi;
int main(){
n=read();
for(int i=;i<=n;i++){
a=read();
if(a>mx) mx=a,mxi=i;
}
printf("%d",mxi);
}
B
描述 题目描述 小B生活在一个很奇怪的国家里,这个国家的钱的面值只有可能是25,,100的。小B最近在做社会实践,这次它选择在一个餐厅里干这件事情。但今天发生了一件有趣的事,这件事情是这个样子的,餐厅里大家都在排队买饭,粗心的打饭阿姨忘记要带零钱,并且所有排队打饭的人只带了一张钱。 具体地,第i个人带了一张面额为ai的钱,为了方便起见,我们规定每个人都想买价值25元的饭盒。阿姨显得不知所措。聪明的小B想到了一个方法,让带了25元的先买饭!这样阿姨就有了更多的零钱去找开一些面值较大的钱。 但这样对于一些人来说仍有可能找不开零钱,小B想知道是否存在一种排队方案,能够对所有人找开零钱。如果可行输出“YES”,否则输出“NO”。 输入格式 第一行一个数n,表示有n个想买饭的人。 接下来一行n个数ai,表示第i个人带着的钱的面额。 输出格式 输出“YES”或者“NO”。 备注 输入样例 输出样例 NO 数据范围 对于100%的数据n<=,ai=25或者50或者100。
题目
题解:显然,找一张50需要一张25,一张100需要三张25 或者 一张50和一张25,记录个数判断就行了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,x,a,b,c;
bool solve(){
if(a<b) return false;
int d=a-b;
if(d<=b){
if(d>=c) return true;
else return false;
}else{
if(b+(d-b)/>=c) return true;
else return false;
}
}
int main(){
//freopen("in.txt","r",stdin);
n=read();
for(int i=;i<=n;i++){
x=read();
if(x==) a++;
else if(x==) b++;
else if(x==) c++;
}
if(solve()) puts("YES");
else puts("NO");
}
C
描述 题目描述 小C是一名数学家,由于它自制力比较差,经常通宵研究数学问题。 这次它因为这个数学问题已经两天两夜没有睡觉了,再不研究出来就要出人命了!快帮帮它吧! 这个问题是这样的,有一个数n,将其拆分成若干自然数之和,要求乘积最大! 如果你以为问题仅仅这么简单,那你就太naive了。 由于小C挑战自己的自我修养,它规定分成的自然数两两之间一定不能相等! 它请你输出这个乘积最大是多少,但这个答案太大了,小C并没有兴趣看那么长的数字,它只想知道这个数对1000000007取模后的值是多少。 输入格式 一行一个数表示n 输出格式 一个数表示答案 备注 输入样例 输出样例 数据范围 对于30%的数据n<=。 对于50%的数据n<=。 对于100%的数据1<=n<=。
题目
题解:
我太navie了.......
拆分不是按数位拆分,是把这个数字大小分成若干正整数
如果可以重复的话,是个很经典的问题,就是不足4就尽量分成3,是4的话显然4比1*3更优
那么不准重复,稍微严(自)格(己)证(瞎)明(猜)一下发现还是尽量分成小的数字(可以手动模拟一下小数看看),当然一定不能分出1
那么就从2开始不断分,2 3 4 5 6....最后剩下的不够了就开始让分出的最大的+1,再让次大的+1,一直加下去.....最后还可能剩1,再让最大的+1就行了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
const int INF=1e9,N=1e5,MOD=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,a[N],p;
int b[]={,,,,,,,,,,};
ll ans=;
void solve(){
int x=,t=n;
while(t>=x) t-=x,a[++p]=x,x++;
int pp=p;
while(t){
p=pp;
for(;p>=&&t;t--)
a[p]+=,p--;
}
for(int i=;i<=pp;i++) ans=ans*a[i]%MOD;
printf("%lld",ans);
}
int main(){
//freopen("in.txt","r",stdin);
n=read();
if(n<=) printf("%d",b[n]);
else solve();
}
D
描述 题目描述 小D是一名魔法师,它最喜欢干的事就是对批判记者了。 这次记者招待会上,记者对于小D的数学很好奇。于是小D找了个方法把记者批判了一番。 它对记者抛出了这么一个问题:我有n点能量,写下数字i(<=i<=)需要花费a{i}点能量,我用这n点能量最多能写出什么数来?(当然可以不用光n点能量,具体看样例) 记者们一脸懵逼,于是来求助于你。 输入格式 一行10个数,表示n,a1,a2,a3,…,a9。 输出格式 一个数表示答案。 备注 输入样例1 输出样例1 输入样例2 输出样例2 数据范围 对于30%的数据n,ai<=。 对于60%的数据n,ai<=。 对于100% 的数据1<=n,ai<=,n>=min{ai}。
题目
题解:
什么是DP渣?就是遇到一道题就想DP还想不出来
本题贪心就好
先长度,全选最便宜的数字,得到最长长度
然后从高位开始(数字比较嘛),让高位变成能变成的最大数字,在考虑次高位,以此类推
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,a[],mn=INF,mni,cnt,ans[N];
void solve(){
cnt=n/mn;
n%=mn;
for(int i=;i<=cnt;i++) ans[i]=mni;
for(int i=;i<=cnt&&n;i++)
for(int j=;j>=ans[i];j--)
if(n+a[ans[i]]>=a[j]) n=n+a[ans[i]]-a[j],ans[i]=j;
for(int i=;i<=cnt;i++) printf("%d",ans[i]);
}
int main(){
//freopen("in.txt","r",stdin);
n=read();
for(int i=;i<=;i++){
a[i]=read();
if(a[i]<=mn) mn=a[i],mni=i;
}
solve();
}
E
描述 题目描述 小B生活在一个很奇怪的国家里,这个国家的钱的面值只有可能是25,,100的。小B最近在做社会实践,这次它选择在一个餐厅里干这件事情。但今天发生了一件有趣的事,这件事情是这个样子的,餐厅里大家都在排队买饭,粗心的打饭阿姨忘记要带零钱,并且所有排队打饭的人只带了一张钱。 具体地,第i个人带了一张面额为ai的钱,为了方便起见,我们规定每个人都想买价值25元的饭盒。阿姨显得不知所措。聪明的小B想到了一个方法,让带了25元的先买饭!这样阿姨就有了更多的零钱去找开一些面值较大的钱。 但这样对于一些人来说仍有可能找不开零钱,小B想知道是否存在一种排队方案,能够对所有人找开零钱。 但这个故事是关于小E的。 所以它并不关心能否有这么一种排队方案,它关心的是存在多少这样的排队方案。对于两个持有25元纸币的人,我们认为他们两个人交换位置仍然是同一种排队方案。(也就是说持有同一种纸币的人都可以看作相同的人) 由于答案很大,你只需输出答案对1000000007取模后的结果就可以了。 输入格式 第一行一个数n,表示有n个想买饭的人。 接下来一行n个数ai,表示第i个人带着的钱的面额。 输出格式 输出一个数表示答案。 备注 输入样例 输出样例 数据范围 对于30%的数据n<=。 对于60%的数据n<=。 对于100%的数据n<=,ai=25或者50或者100。
题目
题解:
想了一个DP,都写出来了才发现有的非法情况不能判断,无奈打了爆搜,结果只有20分
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=,INF=1e9,MOD=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,x,a,b,c;
bool check(int a,int b,int c){
if(a<b) return false;
int d=a-b;
if(d<=b){
if(d>=c) return true;
else return false;
}else{
if(b+(d-b)/>=c) return true;
else return false;
}
}
int ans;
void dfs(int d,int x,int y,int z,int rx,int ry){
if(d==n+){ans++;if(ans>=MOD) ans-=MOD;return;}
if(x<a) dfs(d+,x+,y,z,rx+,ry);
if(y<b&&rx) dfs(d+,x,y+,z,rx-,ry+);
if(z<c){
if(rx>=) dfs(d+,x,y,z+,rx-,ry);
if(ry>=&&rx>=) dfs(d+,x,y,z+,rx-,ry-);
}
}
int main(){
//freopen("in.txt","r",stdin);
n=read();
for(int i=;i<=n;i++){
x=read();
if(x==) a++;
else if(x==) b++;
else if(x==) c++;
}
if(!check(a,b,c)) puts("");
else {dfs(,,,,,);printf("%d",ans%MOD);}
}
[2017-01-13]
我明白为什么20分了,排队排100的有两种找钱方法,但是这两种排队方案是一样的,所以贪心选择一张25一张50就好了
其实DP也很简单,我当时的问题是无法知道还剩下几张25几张50,其实只要加两维状态保存就可以了,数据范围实在太小........
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=,INF=1e9,MOD=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,x,a,b,c;
int f[][N][N][N][N],p,ans;
void dp(){
p=;
f[p][][][][]=;
for(int i=;i<n;i++,p^=){
memset(f[p^],,sizeof(f[p^]));
for(int j=;j<=i&&j<=a;j++)
for(int k=;j+k<=i&&k<=b;k++) if(i-j-k<=c)
for(int l=;l<=j;l++)
for(int s=;s<=k;s++){
int now=f[p][j][k][l][s];
if(now==) continue;
if(j+<=a) (f[p^][j+][k][l+][s]+=now)%=MOD;
if(k+<=b&&l->=) (f[p^][j][k+][l-][s+]+=now)%=MOD;
if(i-j-k+<=c&&l->=&&s->=) (f[p^][j][k][l-][s-]+=now)%=MOD;
else if(i-j-k+<=c&&l->=) (f[p^][j][k][l-][s]+=now)%=MOD;
}
}
for(int l=;l<=a;l++)
for(int s=;s<=b;s++) ans=(ans+f[p][a][b][l][s])%MOD;
printf("%d",ans);
}
int main(){
//freopen("in.txt","r",stdin);
n=read();
for(int i=;i<=n;i++){
x=read();
if(x==) a++;
else if(x==) b++;
else c++;
}
dp();
}
DP正解
F
描述 这个故事是关于小F的,它有一个怎么样的故事呢。 小F是一个田径爱好者,这天它们城市里正在举办马拉松比赛,这个城市可以被看作是n个点m条带权有向边组成的图。马拉松比赛的终点只有一个:点S。 有k个人参加了这场马拉松,小F所在的城市的马拉松与正常的马拉松不一样,每个人的起点都是不相同的,具体地,第i个人从第{ai}个城市出发,并且第i个人的速度是{vi}。每个人当然是会沿着最短路跑到S点,如果一个人跑步的距离是s,速度是v,那么他所花费的时间为s/v。 现在小F想知道,谁是最快到达终点的。若有多个同时到达终点的,就求跑的路最长的,如果有多个同时到达终点且跑的路最长的,就求编号最大的。 小F想知道那个人的编号是多少。 输入格式 第一行3个数字,n,k,m,表示点的个数,跑步的人数,以及路径的条数。 接下来一行m行,每行3个数ai,bi,ci表示有一条从ai到bi长为ci的有向路径。 接下来一行一个数S。 接下来一行k个数,表示每个人的起点xi。 接下来一行k个数,表示每个人的速度vi。 输出格式 输出一个数表示答案。 测试样例1 输入 输出 备注 输入样例 输出样例 数据范围 对于30%的数据n<=,m<=。 对于100%的数据n<=,m<=。<=ci<=,<=xi,S<=n,<=vi<=,<=k<=n。
题目
题解:
这不最短路裸题?
为了防止double误差最后排序后用分数判断
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=,M=5e3+,INF=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,k,m,s,u,v,w;
struct person{
int x,id;
double d,v,t;
bool operator <(const person &r)const{return t<r.t;}
}p[N];
struct edge{
int v,ne,w;
}e[M<<];
int h[N],cnt=;
inline void ins(int u,int v,int w){
cnt++;
e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
}
inline void lop(int &x){if(x==N) x=;else if(x==) x=N-;}
int d[N],q[N],head,tail,inq[N];
void spfa(int s){
for(int i=;i<=n;i++) d[i]=INF;
head=tail=;
q[tail++]=s;inq[s]=;d[s]=;
while(head!=tail){
int u=q[head++];inq[u]=;lop(head);
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v,w=e[i].w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(!inq[v]){
if(d[v]<d[q[head]]) head--,lop(head),q[head]=v;
else q[tail++]=v,lop(tail);
inq[v]=;
}
}
}
}
}
bool cmp(person a,person b){
if(a.d==b.d) return a.id>b.id;
else return a.d>b.d;
}
void solve(){
for(int i=;i<=k;i++) p[i].d=d[p[i].x],p[i].t=p[i].d/p[i].v;
sort(p+,p++k);
int equ=;
for(int i=;i<=k;i++){
if(p[i-].d*p[i].v==p[i].d*p[i-].v) equ++;
else break;
}
sort(p+,p++equ,cmp);
printf("%d",p[].id);
}
int main(){
n=read();k=read();m=read();
for(int i=;i<=m;i++){u=read();v=read();w=read();ins(v,u,w);}
s=read();
for(int i=;i<=k;i++) p[i].x=read(),p[i].id=i;
for(int i=;i<=k;i++) scanf("%lf",&p[i].v);
spfa(s);
solve();
}
清北冬令营入学测试[ABCDEF]的更多相关文章
- Tyvj2017清北冬令营入学测试
P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背 ...
- 清北学堂入学测试P4751 H’s problem(h)
P4751 H’s problem(h) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学 ...
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
- 清北学堂2017NOIP冬令营入学测试
P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背 ...
- AC日记——C’s problem(c) TYVJ P4746 (清北学堂2017冬令营入学测试第三题)
P4746 C’s problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比 ...
- 清北学堂2017NOIP冬令营入学测试P4749 C’s problem(c)
P4746 C's problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比较差 ...
- 清北学堂2017NOIP冬令营入学测试P4749 F’s problem(f)
时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 这个故事是关于小F的,它有一个怎么样的故事呢. 小F是一个田径爱好者,这天它们城市里正在 ...
- 清北学堂2017NOIP冬令营入学测试P4747 D’s problem(d)
时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题 描述 题目描述 小D是一名魔法师,它最喜欢干的事就是对批判记者了. 这次记者招待会上,记者对 ...
随机推荐
- layui-laypage模块代码详解
/** layui-v2.4.0 MIT License By https://www.layui.com */;layui.define(function(e) { "use strict ...
- 解决 Electron 包下载太慢问题
项目下新建 .npmrc 文件,加入如下配置: electron_mirror=https://npm.taobao.org/mirrors/electron/ 即使用淘宝的源,重新 npm inst ...
- 配置replica set的常见问题
总有人问起配置ReplicaSet不成功,总结了一下基本上的可能性就几种,检查步骤如下: 假设三台机器的IP分别是 A: 192.168.1.2 a.test.com B:192.168.1.3 b. ...
- RW RO ZI ROM keil中的含义
编译的一个ARM的程序,会得到这样的信息: ============================================================================== ...
- 2016 最佳 Linux 发行版排行榜【转】
转自:http://www.linuxstory.org/the-best-linux-distros-of-2016/?utm_source=tuicool&utm_medium=refer ...
- Tomcat安装与优化
Tomcat安装与优化 1.安装jdk环境 最新的JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downlo ...
- MySQL 四种链接
1.内联接 INNER JOIN(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行. ...
- Linux 网络编程实例
/*socket->bind->listen->accept->recv/recvfrom->send/sendto->close 客户端:socket->c ...
- Python基础三(选择,循环)
序 首先我们知道程序的执行有三种结构:顺序.选择.循环三种结构,而为了方便我们书写和多次利用我们就需要把一段代码封装器来,这就是方法.今天我就说的是程序的基本结构的格式和方法. 注:所有的程序都可以通 ...
- (二) Log4j 配置详解
第一节: rootLogger 根配置 Log4j 根配置语法 log4j.rootLogger = [ level ] , appenderName, appenderName, … 指代 把指定级 ...