zoukankan      html  css  js  c++  java
  • NOIP 2002

    T1:均分纸牌

    题目描述

    有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。

    移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。

    现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。

    例如 N=4,4 堆纸牌数分别为:

    ①9②8③17④6

    移动3次可达到目的:

    从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10)。

    输入输出格式

    输入格式:

    键盘输入文件名。文件格式:

    N(N 堆纸牌,1 <= N <= 100)

    A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)

    输出格式:

    输出至屏幕。格式为:

    所有堆均达到相等时的最少移动次数。

    输入输出样例

    输入样例#1:
    4
    9 8 17 6
    
    输出样例#1:

    3

    Solution:

      本题只需要模拟一下。

      首先预处理求出平均值,如果为0则不需要移动。然后固定从1或N开始移动牌堆,for一下就好了~

      //可能出现负数

     1 #include<cstdio>
     2 using namespace std;
     3 int n,a[105],sum=0,cnt=0,p=0;
     4 int main(){
     5     scanf("%d",&n);
     6     for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum+=a[i];
     7     p=sum/n;
     8     for(int i=1;i<=n;i++) a[i]-=p;
     9     for(int i=1;i<=n;i++) {
    10         if(!a[i]) continue;
    11         a[i+1]+=a[i];
    12         cnt++;
    13     } 
    14     printf("%d",cnt);
    15     return 0;
    16 }

    T3 自由落体

    题目描述

    在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=1/2*g*(t^2),其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。

    如下图:

    小车与所有小球同时开始运动,当小球距小车的距离 <= 0.0001(感谢Silver_N修正) 时,即认为小球被小车接受(小球落到地面后不能被接受)。

    请你计算出小车能接受到多少个小球。

    输入输出格式

    输入格式:

    键盘输人:

    H,S1,V,L,K,n (l<=H,S1,V,L,K,n <=100000)

    输出格式:

    屏幕输出:

    小车能接受到的小球个数。

    输入输出样例

    输入样例#1:
    5.0 9.0 5.0 2.5 1.8 5
    
    输出样例#1
       1

    Solution:

      这是一个有精度的题目。

      也是简单模拟,分别求出两个零界点,然后进行判断。

      嗯,代码有点短...

     1 #include<cstdio>
     2 #include<cmath>
     3 using namespace std;
     4 int n,ans=0;
     5 double h,s,v,l,k;
     6 int main(){
     7     scanf("%lf%lf%lf%lf%lf%d",&h,&s,&v,&l,&k,&n);
     8     double ll,rr;
     9     ll=-0.0001+(s-sqrt(h/5)*v);
    10     rr= 0.0001+(s-sqrt((h-k)/5)*v)+l;
    11     for(int i=0;i<n;i++) if(i<rr&&i>ll) ans++;
    12     printf("%d",ans);
    13     return 0;
    14 }
     
  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/drizzly/p/7611820.html
Copyright © 2011-2022 走看看