码迷,mamicode.com
首页 > 其他好文 > 详细

20170915NOIP练习赛(滑稽)

时间:2017-09-19 17:51:32      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:turn   cal   scanf   fclose   fine   main   text   center   scan   

T1:游戏(game)

【问题描述】

R和小H在玩某个双人联机小游戏,一开始两人所操控的角色各有1点力量值,而在游戏中,每通过一关都会掉落一些力量强化道具。奇怪的是,明明是双人小游戏,每关却都会掉落3个相同的力量强化道具,于是两人决定每关每人先拿一个,剩下一个猜拳决定给谁。一个力量强化道具能使一个角色的力量值变为原来的若干整数倍,同一关卡掉落的道具倍率都相同,而不同的关卡可能不同。小R从攻略上找到了一些会产生特殊效果的力量值组合,他想知道哪些组合是按他们的道具分配方式有可能在通过某关时达成的。

【输入格式】

第一行一个正整数n,表示力量值组合的个数。

接下来n行,每行两个非负整数ai,bi,表示一个力量值组合。

【输出格式】

输出共n行,每行一个”YES”或”NO”表示是否能够达成。

【样例输入】

2

2 4

1 8

【样例输出】

YES

NO

【数据范围】

本题共10个测试点,其中第x个测试点满足n<=ai,bi<=。

solution:

注意输出不要输错了。

#include<cstdio>
#include<cmath>
int main()
{
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    int n,a,b,c;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d",&a,&b);
        if(!a&&!b){puts("YES");continue;}
        if(!a||!b){puts("NO");continue;}
        c=int(pow(1LL*a*b,1./3)+0.5);
        puts(1LL*c*c*c==1LL*a*b&&a%c==0&&b%c==0?"YES":"NO");
    }
    fclose(stdin);fclose(stdout);return 0;
}

T2:数字(number)

【问题描述】

R被某人要求做一个报告,报告中要用到一些数据,可惜小R没有,只好自己瞎编一个,于是他随便滚了下键盘,出来一个奇怪的数字。因为明眼人都看的出这个数字是乱打的,所以小R打算强化一下这个数字的可信度,首先他把这一大长串数字分成了n个,然后他决定选出其中k个,把它们乘起来得到最后的数字。众所周知,一个数字末尾的0越多越高大上,所以小R想要最大化得到的数字末尾0的数量。按照套路,请你解决一下。

【输入格式】

第一行两个正整数nk

接下来n行,每行一个非负整数ai,表示给出的数字。

【输出格式】

输出一个整数,表示答案。

【样例输入】

3 2

20

50

80

【样例输出】

3

【数据范围】

对于20%的数据,n<=15ai<=10

对于30%的数据,n<=25

对于50%的数据,n<=50ai<=100

对于70%的数据,n<=100ai<=

对于100%的数据,n<=200ai<=

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MN 200
#define K 25
int f[MN+5][MN*K+5];
inline void rw(int&a,int b){if(b>a)a=b;}
int main()
{
    freopen("number.in","r",stdin);
    freopen("number.out","w",stdout);
    int n,k,s2,s5,l,i,j,ans=0;long long x;
    scanf("%d%d",&n,&k);
    memset(f,200,sizeof(f));f[0][0]=0;
    for(l=1;l<=n;++l)
    {
        scanf("%I64d",&x);if(!x){ans=1;continue;}
        for(s2=0;x%2==0;++s2)x/=2;
        for(s5=0;x%5==0;++s5)x/=5;
        for(i=min(k,l);i--;)for(j=0;j<=i*K;++j)rw(f[i+1][j+s5],f[i][j]+s2);
    }
    for(l=0;l<=k*K;++l)rw(ans,min(l,f[k][l]));
    printf("%d",ans);
}

T3:餐厅(restaurant)

【问题描述】

R最近在玩一款模拟餐厅打工的游戏,其中有一个叠盘子的小游戏小R很喜欢。这个小游戏是这样的:有一个放盘子的机器会在一条直线上运动,机器里装着n个盘子,其中第i个盘子半径为ri,并且如果要放下该盘子,盘子的中心必须放在直线上xi的位置上,小R可以决定放下哪些盘子和放下这些盘子的顺序,盘子可以放在空位上,或者叠在一个上面没有其他盘子的盘子上,但要求被叠的盘子必须包含要叠上去的盘子。小R想要让叠出的盘子尽量高,请你计算出最高的一叠最多能叠几个盘子 。

【输入格式】

第一行一个正整数n,表示盘子数。

接下来n行,每行两个正整数rixi

【输出格式】

输出一个整数,表示答案。

【样例输入】

3

3 5

2 4

2 6 

【样例输出】

2

【数据范围】

对于20%的数据,n<=10

对于50%的数据,n<=1,000

对于100%的数据,n<=100,000ri,xi<=

 

#include<cstdio>
#include<algorithm>
using namespace std;
#define MN 100000
#define N 131072
struct P{int l,r;}p[MN+5];
bool cmp(const P&a,const P&b){return a.r==b.r?a.l>b.l:a.r<b.r;}
int t[N*2+5],c[MN+5],cn;
void renew(int k,int x){for(k+=N;k;k>>=1)t[k]=max(t[k],x);}
int query(int l,int r)
{
    int res=0;
    for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1)
    {
        if(~l&1)res=max(res,t[l+1]);
        if( r&1)res=max(res,t[r-1]);
    }
    return res;
}
int main()
{
    freopen("restaurant.in","r",stdin);
    freopen("restaurant.out","w",stdout);
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
        scanf("%d%d",&p[i].r,&p[i].l),
        c[i]=p[i].l-=p[i].r,p[i].r=p[i].l+2*p[i].r;
    sort(c+1,c+n+1);cn=unique(c+1,c+n+1)-c-1;
    sort(p+1,p+n+1,cmp);
    for(i=1;i<=n;++i)
        p[i].l=lower_bound(c+1,c+cn+1,p[i].l)-c,
        renew(p[i].l,query(p[i].l,cn)+1);
    printf("%d",t[1]);
    fclose(stdin);fclose(stdout);return 0;
}

 

20170915NOIP练习赛(滑稽)

标签:turn   cal   scanf   fclose   fine   main   text   center   scan   

原文地址:http://www.cnblogs.com/qizhengquan/p/7552663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!