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]的更多相关文章

  1. Tyvj2017清北冬令营入学测试

    P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背 ...

  2. 清北学堂入学测试P4751 H’s problem(h)

    P4751 H’s problem(h)  时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学 ...

  3. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  4. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  5. 清北学堂2017NOIP冬令营入学测试

    P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背 ...

  6. AC日记——C’s problem(c) TYVJ P4746 (清北学堂2017冬令营入学测试第三题)

    P4746 C’s problem(c)   时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比 ...

  7. 清北学堂2017NOIP冬令营入学测试P4749 C’s problem(c)

    P4746 C's problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比较差 ...

  8. 清北学堂2017NOIP冬令营入学测试P4749 F’s problem(f)

    时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 这个故事是关于小F的,它有一个怎么样的故事呢. 小F是一个田径爱好者,这天它们城市里正在 ...

  9. 清北学堂2017NOIP冬令营入学测试P4747 D’s problem(d)

    时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题 描述 题目描述 小D是一名魔法师,它最喜欢干的事就是对批判记者了. 这次记者招待会上,记者对 ...

随机推荐

  1. 【译】第五篇 Integration Services:增量加载-Deleting Rows

    本篇文章是Integration Services系列的第五篇,详细内容请参考原文. 在上一篇你学习了如何将更新从源传送到目标.你同样学习了使用基于集合的更新优化这项功能.回顾增量加载记住,在SSIS ...

  2. 如何在Maven和Gradle中配置使用Groovy 2.4与Spock 1.0

    如何在Maven和Gradle中配置使用Groovy 2.4与Spock 1.0 原文 https://dzone.com/articles/spock-10-groovy-24 翻译 hxfiref ...

  3. npm_一个有意思的npm包

    $ npm install yosay const yosay = require('yosay'); console.log(yosay('Hello, and welcome to my fant ...

  4. GridView Postback后出错Operation is not valid due to the current state of the object.

    一.问题起因 最近项目中有一页面第一次search后正常,但是再次点击其它任何按钮都会报错,亦即postback后页面有问题,经检查是由于页面有一GridView且数据量极大,记录大概有上千条,这儿解 ...

  5. JS函数的几种用法

    1.正常使用:

  6. android开发中常用的快捷键

    Eclipse快捷键-方便查找,呵呵,记性不好 行注释/销注释 Ctrl+/  块注释/销注释/XML注释 Ctrl+Shift+/   Ctrl+Shift+\查找 查找替换 Ctrl+H  Ctr ...

  7. centos 安装memcache服务后memcahce本机连接Permission

    自己手动在虚拟机下装了下memcache,整个过程真是充满波折,本身用php5.3安装memcache扩展就麻烦很多,无法通过yum直接安装,安装方法详见http://chenwei.me/blog/ ...

  8. Explorer : 发布一个key-value存储系统,带有客户端和服务器端

    Explorer 一个key-value存储系统,带有客户端和服务器端.使用非常方便. 使用B+树作为存储引擎,客户端和服务器端使用TCP协议进行通信. 代码采用C++实现,底层将客户端和服务器通信封 ...

  9. 使用脚本实现killproc的功能

    在shell提示符号下输入type killproc,会发现killproc实在 /sbin/目录下,通过man killproc可以查看这个脚本(姑且这么称为脚本)的用法,现在,把这个脚本的实现过程 ...

  10. 使用MongoDB命令工具导出、导入数据

    Windows 10家庭中文版,MongoDB 3.6.3, 前言 在前面的测试中,已经往MongoDB的数据库中写入了一些数据.现在要重新测试程序,数据库中的旧数据需要被清理掉,可是,又想保存之前写 ...