• NOIP simulation


    NOIP 模拟赛
    Day 1
    题目名称LGTB 玩扫雷LGTB 学分块LGTB 打THD
    英文代号mine divide thd
    时限1 秒1 秒1 秒
    输入文件mine.in divide.in thd.in
    输出文件mine.out divide.out thd.out
    内存限制64Mb 64Mb 64Mb
    测试点个数10 10 20
    总分100 100 100
    时间:2014 年10 月4 日
    1
    LGTB 玩扫雷
    在一个n  m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示)。
    LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷。
    请帮助他输出写了之后的棋盘
    输入
    输入第一行包含两个整数n, m 代表棋盘大小
    接下来n 行,每行m 个字符,代表棋盘
    1  n,m  1000
    输出
    输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘
    样例
    样例输入样例输出
    3 3
    *.*
    ...
    *.*
    *2*
    242
    *2*
    2
    LGTB 学分块
    LGTB 最近在学分块,但是他太菜了,分的块数量太多他就混乱了,所以只能分成3 块
    今天他得到了一个数组,他突然也想把它分块,他想知道,把这个数组分成3 块,块可以为空。假设3 块各
    自的和中的最大值最小
    请输出分完之后3 块中的最大值
    输入
    输入第一行包含一个整数n 代表数组大小
    接下来n 个整数a1, a2, ..., an,代表数组
    对于40% 的数据,1  n  10
    对于70% 的数据,1  n  103
    对于100% 的数据,1  n  105, 1  ai  107
    输出
    输出包含1 个整数,代表分块完成后3 块中的最大值
    样例
    样例输入样例输出
    10
    2 5 1 4 7 3 6 2 5 1
    14
    3
    LGTB 玩THD
    LGTB 最近在玩一个类似DOTA 的游戏名叫THD
    有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面
    每个小兵有一定的血量hi,杀死后有一定的金钱gi
    每一秒,他都可以攻击任意一个活着的小兵,对其造成P 点伤害,如果小兵的血量低于1 点,小兵死亡,他
    得到金钱。他也可以不攻击任何小兵。
    每一秒LGTB 攻击完毕之后,塔会攻击距离塔最近的一个活着的小兵,对其造成Q 点伤害,如果小兵的血
    量低于1 点,小兵死亡,LGTB 不会得到金钱
    现在LGTB 想知道,在他选择最优策略时,他能得到多少钱。
    输入
    输入第一行包含3 个整数P, Q, N
    接下来N 行,每行包含2 个整数hi, gi
    第i 个小兵和塔之间的距离为i
    输入的意义如题面所示
    对于20% 的数据,1  N  4
    对于50% 的数据,1  N  20
    对于100% 的数据,20  P,Q  200, 1  N  100, 1  hi  200, 0  gi  106
    输出
    输出包含一个整数W,代表LGTB 最多能获得的金钱
    样例
    样例输入样例输出
    20 60 3
    80 100
    80 200
    120 300
    500
    4

     1 #include<fstream>
     2 using namespace std;
     3 char a[1002][1002];
     4 const int d[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
     5 int n;int m;
     6 int main(){
     7     ifstream fin("mine.in");
     8     ofstream fout("mine.out");
     9     
    10     fin>>n>>m;
    11     
    12     for(int i=1;i<=n;i++)
    13         for(int j=1;j<=m;j++)
    14             fin>>a[i][j];
    15     
    16     for(int i=1;i<=n;i++)
    17         for(int j=1;j<=m;j++){
    18             if(a[i][j]=='.'){
    19                 a[i][j]='0';
    20                 for(int k=0;k<8;k++){
    21                     int h=i+d[k][0];
    22                     int p=j+d[k][1];
    23                     if(a[h][p]=='*')a[i][j]++;
    24                 }
    25             }
    26         }
    27             
    28     for(int i=1;i<=n;i++)
    29         fout<<&a[i][1]<<endl;
    30     return 0;
    31 }
     1 #include<fstream>
     2 using namespace std;
     3 class divide{
     4     public:
     5         static long long binary_divide(long long * ps,int L,int R){
     6             int lft=L;int rght=R;
     7             long long best=1e12;
     8             while(lft<rght){
     9                 int m=(lft+rght)>>1;
    10                 long long s1=ps[m]-ps[L-1];
    11                 long long s2=ps[R]-ps[m];
    12                 long long t=max(s1,s2);
    13                 if(t<best)best=t;
    14                 if(s1==s2)break;
    15                 if(s1<s2)lft=m+1;
    16                 else rght=m;
    17             }
    18             return best;
    19         }
    20 };
    21 int n;int a[100001];
    22 long long ps[100001];
    23 long long ans=1e12;
    24 int main(){
    25     ifstream fin("divide.in");
    26     ofstream fout("divide.out");
    27     fin>>n;
    28     
    29     for(int i=1;i<=n;i++)
    30         fin>>a[i];
    31     
    32     if(n==1){
    33         fout<<a[1]<<endl;
    34         return 0;
    35     }
    36     
    37     if(n==2){
    38         fout<<max(a[1],a[2])<<endl;
    39         return 0;
    40     }
    41     
    42     if(n==3){
    43         fout<<max(a[1],max(a[2],a[3]))<<endl;
    44         return 0;
    45     }
    46     
    47     for(int i=1;i<=n;i++)
    48         ps[i]=ps[i-1]+a[i];
    49         
    50     for(int i=1;i<n;i++){
    51         long long s1=ps[i];
    52         long long s2=divide().binary_divide(ps,i+1,n);
    53         long long t=max(s1,s2);
    54         if(t<ans)ans=t;
    55     }
    56     
    57     fout<<ans<<endl;
    58     return 0;
    59 }
     1 #include<fstream>
     2 #include<algorithm>
     3 using namespace std;
     4 const int bld=0;
     5 const int scr=1;
     6 class thd{
     7     public:
     8         static void dynamicProgramming(int (* soldier)[2],int (*m)[2001],int n,int p,int q){
     9             for(int i=0;i<=n;i++)
    10                 fill(m[i],m[i]+2001,-1e9);
    11             m[0][1]=0;
    12             for(int i=1;i<=n;i++){
    13                 int * s=soldier[i];
    14                 int t=(s[bld]+q-1)/q;
    15                 int h=(s[bld]-q*t+q+p-1)/p;
    16                 for(int j=0;j<=1000;j++){
    17                     if(j-t>=0)m[i][j]=m[i-1][j-t];
    18                     if(j+h-t+1>=0&&(m[i-1][j+h-t+1]+s[scr])>m[i][j]){
    19                         m[i][j]=m[i-1][j+h-t+1]+s[scr];
    20                     }
    21                 }
    22             }
    23         }
    24 };
    25 
    26 int soldier[101][2];
    27 int m[101][2001];
    28 int n;int p;int q;int best=-1e9;
    29 int main(){
    30     ifstream fin("thd.in");
    31     ofstream fout("thd.out");
    32     fin>>p>>q>>n;
    33     for(int i=1;i<=n;i++)
    34         fin>>soldier[i][bld]>>soldier[i][scr];
    35     thd().dynamicProgramming(soldier,m,n,p,q);
    36     
    37     for(int i=0;i<=1000;i++)
    38         if(m[n][i]>best)best=m[n][i];
    39     
    40     fout<<best<<endl;
    41     return 0;
    42 }

    explanation

    m[i][j]means kill soldier i with j attacktion remain.

  • 相关阅读:
    Java中final,finalize和finally的区别
    EJB
    sql server函数
    rollup和grouping函数
    Java关于抽象类能否被实例化的问题
    jdk
    点击导航文字,页面刷新后仍然是点击状态
    jquery实现全选和取消全选
    去掉required红色边框
    左侧菜单高度自适应右侧内容
  • 原文地址:https://www.cnblogs.com/JebediahKerman/p/5671828.html
Copyright © 2020-2023  润新知