题目名称 | Lsbm | Escape | Happy | Change |
输入文件 | Lsbm.in | Escape.in | Happy.in | Change.in |
输出文件 | Lsbm.out | Escape.out | Happy.out | Change.out |
测试点数目 | 10 | 10 | 10 | 10 |
测试点分数 | 10 | |||
题目类型 | 传统 | 传统 | 传统 | 传统 |
时间限制 | 1s | 1s | 1s | 1s |
空间限制 | 128M | 128M | 128M | 128M |
一.Sss之零食被没
众所周知,sss同学曾经被信老师没收过零食。话说那是个只有信息组在的自习课,sss和兆哥坐在一起,sss偷偷摸出隐藏许久的零食,冲兆哥坏坏一笑(哈哈,我有你没有!)兆哥小声对sss说:“老班!”sss又坏坏一笑(哼,想骗我?)sss正欲将袋打开,说时迟,那时快,老班的手早已将它夺走,可怜的sss,连袋都没打开就被没收了。后来sss恍然大悟,原来今天是他的黑色星期五!于是sss想算一下以后的某一天是星期几,如果是星期五,他绝不会再吃零食了!
输入格式:
一行三个整数Y,M,D,表示要计算的日期的年,月,日。
输出格式:
输出sunday,monday,tuesday,wednesday,thursday,friday,saturday中得一个表示答案。(首字母大写)
样例输入:
2011 10 19
样例输出:
Wednesday
范围:
保证数据时间晚于2011年10月18日,、早于99999年12月31日
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int year,month,day; int dp[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; string s[8]; int nian(int x){ if ((x%400==0) || (x%4==0 && x%100!=0)) return 366; return 365; } int run(int x){ if ((x%400==0) || (x%4==0 && x%100!=0)) return 1; return 0; } int getnext(int y,int m,int d){ bool flag=0; if (m>10) flag=true; else if (m==10 && d>18) flag=true; if (flag) return y;else return y-1; } int main(){ freopen("lsbm.in","r",stdin); freopen("lsbm.out","w",stdout); s[1]="Monday"; s[2]="Tuesday"; s[3]="Wednesday"; s[4]="Thursday"; s[5]="Friday"; s[6]="Saturday"; s[0]="Sunday"; cin>>year>>month>>day; if (year==2011 && month==10 && day==18){ cout<<s[2]<<endl; return 0; } int st=2; int y=2011,m=10,d=18; while (y!=year || m!=month || d!=day){ st++; st %=7; d++; if (d>dp[0][m]){ m++; d=1; } if (m==13){ break; } } if (y==year && m==month && d==day){ cout<<s[st]<<endl; return 0; } int t=2012; while (t<year){ st=(st+(nian(t) % 7)) % 7; t++; } y=year,m=1,d=1; t=run(year); while (y!=year || m!=month || d!=day){ st++; st %=7; d++; if (d>dp[t][m]){ m++; d=1; } } cout<<s[st]<<endl; return 0; }
二.sss之逃跑未遂
众所周知,sss同学曾经被尼玛大哥抓过。话说那是一个下午大课间,sss同学没有做眼保健操就去超市买东西了,可是不小心碰上了尼玛大哥,sss0.01秒的反应时间后,撒腿就往后跑,他的后面是一条柏油马路,马路不是平坦的,是建在钢板上的,钢板又是建在一些地基上的,每一个地基都有一个高度,一块钢板是平行的,是从一个地基铺到另一个地基的(所以中间的地基不能高于此位置的钢板)(可以是上坡,也可以是下坡),但这两个地基之间最多有k-1个地基。问sss从逃跑点(起点)到教学楼(终点)的路中最少用到几个地基。
输入格式
第一行是N和K,2<=N<=5000,1<=K<=N-1。接下来N行,按顺序是地基的高度h,0<=h<=1000000000。
输出格式
一个整数,表示最少地基数,第一个(起点)和最后一个(终点)一定是被用的地基。
样例输入
13 4
0
1
0
2
4
6
8
6
8
8
9
11
12
样例输出
5
#include <cstdio> #include <iostream> using namespace std; int n,k; int a[5001]; int f[5001]; int min(int a,int b){return a<b?a:b;} int max(int a,int b){return a>b?a:b;} int main(){ freopen("escape.in","r",stdin); freopen("escape.out","w",stdout); cin>>n>>k; for (int i=1;i<=n;i++) cin>>a[i]; f[1]=1; for (int i=2;i<=n;i++){ f[i]=9999999; double mi=999999999; for (int j=i-1;j>=max(1,i-k);j--){ if (mi>=(a[j]-a[i])/(double)(j-i)){ f[i]=min(f[i],f[j]+1); mi=(a[j]-a[i])/(double)(j-i); } } } printf("%d\n",f[n]); return 0; }
三. Sss之XX洗浴
众所周知,这个就不扩展了……
自从这次被抓以后,sss同学很不服气。回家后,sss就开始了他的计划!(你不让我洗浴,我就在家洗个痛快!)sss打算在自家的院子里修一个洗浴池,当然他希望洗浴池越大越好。但是院子里有sss喜欢的一些植物,他不想毁掉任一颗植物,所以洗浴池不能将植物的位置占掉。Sss的院子和洗浴池都是矩形的,浴池要完全处在院子里,并且浴池的轮廓要与院子的轮廓平行或重合。每个植物可以看做一个点,浴池不能覆盖任何一个植物点,但是植物点可以在浴池的边上,请问sss的浴池最大能修多大.
输入格式:
输入文件的第一行包含两个整数l和w,分别表示院子的长和宽。文件的第二行包含一个整数n,表示植物的数量。以下n行每行包含两个整数x和y,表示一个植物点的坐标。所有植物点都位于院子内,即:0<=x<=l,0<=y<=w。
输出
输出文件仅一行,包含一个整数s,表示浴池的最大面积。
样例输入
10 10
4
1 1
9 1
1 9
9 9
样例输出
80
提示
各个测试点1s0<=n<=5
#include <cstdio> #include <algorithm> using namespace std; int w,l; int n; struct node{ int x,y; }a[5100]; int ans; int min(int a,int b){return a<b?a:b;} int max(int a,int b){return a>b?a:b;} int cmp(node a,node b){ if (a.x!=b.x) return a.x<b.x; return a.y<b.y; } int main(){ freopen("happy.in","r",stdin); freopen("happy.out","w",stdout); scanf("%d%d%d",&w,&l,&n); for (int i=1;i<=n;i++){ scanf("%d%d",&a[i].x,&a[i].y); } a[++n].x=0; a[n].y=w; a[++n].x=l; a[n].y=w; a[++n].x=0; a[n].y=0; a[++n].x=l; a[n].y=0; sort(a+1,a+1+n,cmp); for (int i=1;i<n;i++){ int l=a[i].x; int u=w,d=0; bool flag=false; for (int j=i+1;j<=n;j++){ if (a[j].x>a[i].x){ if (!flag) ans=max(ans,(a[j].x-l)*(u-d)); else ans=max(ans,max((a[j].x-l)*(u-a[i].y),(a[j].x-l)*(a[i].y-d))); if (a[j].y>a[i].y) u=min(u,a[j].y); else if (a[i].y>a[j].y) d=max(d,a[j].y); else if (a[i].y==a[j].y) flag=true; } } } printf("%d\n",ans); return 0; }
0001<=l,w<=30000
四:sss之转化模式
众所舟舟知……sss同学会转换模式,我们对两种模式的定义为;♀♂,其实sss的模式转换是建立在他身体的细胞模式转换之上的,比如说这里有6*6的细胞:
♀♂♀♂♀♂
♀♂♀♂♀♂
♀♂♀♂♀♂
♀♂♀♂♀♂
♀♂♀♂♀♂
♀♂♀♂♀♂
所以大家就知道为什么sss的模式总是介于两者之间了,因为他的每个细胞的模式不一样!
Sss的细胞和sss一样有很多的坏毛病,当一个细胞转换模式时,他也会使它上,下,左,右四个细胞转换模式,但是仍算转换一步。比如,对于上图(1,2)的转换模式后总的模式变为:
♂♀♂♂♀♂
♀♀♀♂♀♂
♀♂♀♂♀♂
♀♂♀♂♀♂
♀♂♀♂♀♂
♀♂♀♂♀♂
(3,3)转换模式后总的模式变为:
♀♂♀♂♀♂
♀♂♂♂♀♂
♀♀♂♀♀♂
♀♂♂♂♀♂
♀♂♀♂♀♂
♀♂♀♂♀♂
好了,现在问题来了,sss现在想把n*n的细胞全部转换成♂模式,若不能转化输出‘NO’,若能输出最少需要几步。
注意:为了描述生动应用了♀♂符号,但word中的符号与pascal中的不一样,读入以pascal中的为准,pascal中为了转换方便最好使用ASCII码,♂11,♀12.
样例输入:(数据请粘贴change.in)(粘到pascal中就能看到了)
3
♂♀♂
♀♀♀
♂♀♂
样例输出:
1
范围:
50% n<=5;
100% n<=10;
#include <cstdio> #include <cstring> #define INF 200000000 int a[10],b[10]; int n; bool check(){ for (int i=0;i<n;i++){ if (b[i]) return false; } return true; } int main(){ freopen("change.in","r",stdin); freopen("change.out","w",stdout); scanf("%d",&n); for (int i=0;i<n;i++){ while (getchar()!='\n'){;} for (int j=0;j<n;j++){ char c; scanf("%c",&c); a[i]=(a[i] << 1) + (c==12); } } int ans=INF; for (int i=0;i<1 << n;i++){ int tot=0; memcpy(b,a,sizeof(a)); for (int j=0;j<n;j++) if (i & (1 << j)){ ++tot; b[0] ^= 1 << j; if (j>0) b[0] ^= 1 << (j-1); if (j<n-1) b[0] ^= 1 << (j+1); if (n>1) b[1] ^= 1 << j; } for (int j=1;j<n;j++){ for (int k=0;k<n;k++){ if (b[j-1] & (1 << k)){ ++tot; b[j] ^= 1 << k; b[j-1] ^= 1 << k; if (k>0) b[j] ^= 1 << (k-1); if (k<n-1) b[j] ^= 1 << (k+1); if (j<n-1) b[j+1] ^= 1 << k; } } } if (check() && tot<ans) ans=tot; } if (ans==INF) printf("NO\n");else printf("%d\n",ans); return 0; }