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.
posted on 2016-07-14 21:32 JebediahKerman 阅读(582) 评论(0) 编辑 收藏 举报