这个队长当的有点突然,天将降大任于斯人也,那么肯定就要加油了啊,起码不能辜负了老师的期待吧,于是开启此刷题记,半个月时间,加油吧
先补上之前做的题吧
从两道才做的题开始
201703-1 分蛋糕
思路:按惯例第一题都是水题的,简单模拟,so easy
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
int lef = k;
int sum = 0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
lef -= a[i];
if(lef <=0)
{
lef = k;
sum++;
}
//cout << lef << " " << sum << endl;
}
if(lef < k)
{
sum++;
}
printf("%d\n",sum);
}
return 0;
}
201703-2 学生排队
思路:又是个队列模拟,数组下标的理解思路一定要清晰,难度不大,两个数组,一个记录队列相应位置的人,一个记录人在队列中的位置,关键就在细心吧
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1010;
int pos[maxn];
int que[maxn];
int main()
{
int n,m;
/*while(*/scanf("%d%d",&n,&m);/*!=EOF)
{*/
for(int i=1;i<=n;i++)
{
pos[i] = i;
que[i] = i;
}
for(int i=0;i<m;i++)
{
int p,q;
scanf("%d%d",&p,&q);
if(q==0)
{
continue;
}
else if(q>0)
{
for(int j=pos[p]+1;j<=pos[p]+q;j++)
{
que[j-1] = que[j];
pos[que[j]]--;
}
que[pos[p]+q] = p;
pos[p] += q;
}
else
{
for(int j=pos[p]-1;j>=pos[p]+q;j--)
{
que[j+1] = que[j];
pos[que[j]]++;
}
que[pos[p]+q] = p;
pos[p] += q;
}
/*for(int i=1;i<=n;i++)
{
printf("%d ",que[i]);
}
printf("\n");*/
/*for(int i=1;i<=n;i++)
{
printf("%d ",pos[i]);
}
printf("\n");*/
}
for(int i=1;i<n;i++)
{
printf("%d ",que[i]);
}
printf("%d\n",que[n]);
//}
return 0;
}
201612-1 中间数
再来看两个去年做的题吧
思路:寻找中位数,简单判断就好了
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[1010];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
bool no = true;
int tup=0,tdown=0;
if(n%2!=0)
{
int cen = (n-1)/2;
while(tup<=cen&&a[cen]==a[cen+tup])
{
tup++;
}
while(tdown<=cen&&a[cen]==a[cen-tdown])
{
tdown++;
}
if(tup==tdown)
{
printf("%d\n",a[cen]);
no = false;
}
}
else
{
int cenup = n/2;
int cendow = cenup-1;
if(a[cenup]==a[cendow])
{
while(tup<=cendow&&a[cenup]==a[cenup+tup])
{
tup++;
}
while(tdown<=cendow&&a[cendow]==a[cendow-tdown])
{
tdown++;
}
if(tup==tdown)
{
printf("%d\n",a[cenup]);
no = false;
}
}
}
if(no)
printf("%d\n",-1);
return 0;
}
201612-2 工资计算
思路:又是纯模拟,分类讨论,注意一下精度,没啥大问题
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int t,sum=0,temp;
scanf("%d",&t);
if(t<=3500)
{
sum=t;
}
else if(t>3500&&t<=4955)
{
temp=t-3500;
temp=(int)((double)(temp)/0.97+1e-9);
sum=temp+3500;
}
else if(t>4955&&t<=7655)
{
temp=t-4955;
temp=(int)((double)(temp)/0.9+1e-9);
sum=temp+5000;
}
else if(t>7655&&t<=11255)
{
temp=t-7655;
temp=(int)((double)(temp)/0.8+1e-9);
sum=temp+8000;
}
else if(t>11255&&t<=30755)
{
temp=t-11255;
temp=(int)((double)(temp)/0.75+1e-9);
sum=temp+12500;
}
else if(t>30755&&t<=44755)
{
temp=t-30755;
temp=(int)((double)(temp)/0.7+1e-9);
sum=temp+38500;
}
else if(t>44755&&t<=61005)
{
temp=t-44755;
temp=(int)((double)(temp)/0.65+1e-9);
sum=temp+58500;
}
else if(t>61005)
{
temp=t-61005;
temp=(int)((double)(temp)/0.55+1e-9);
sum=temp+83500;
}
printf("%d\n",sum);
return 0;
}
再来两题大一时做的题,看看当时自己的代码风格,满满的回忆啊,当时用的还是dev
201604-1 折点计数
思路:水题,扫一遍,统计折点就好了
#include<cstdio>
using namespace std;
int main()
{
int n,d1,d2,a1,a2,sum=0;
scanf("%d",&n);
if(n==1)
{
scanf("%d",&a1);
printf("%d\n",0);
}
else
{
scanf("%d%d",&a1,&a2);
d1=a2-a1;
if(n==2)
printf("%d\n",0);
else
{
for(int i=2;i<n;i++)
{
scanf("%d",&a1);
d2=a1-a2;
if(d1*d2<0)
sum++;
d1=d2;
a2=a1;
}
printf("%d\n",sum);
}
}
}
201604-2 俄罗斯方块
思路:模拟俄罗斯方块,现在基本已经不太能看懂当年的代码思路了,也不太想看了,感觉应该就是个模拟,反正当年写了8个循环,哈哈,厉害了
#include<cstdio>
using namespace std;
int main()
{
int g[15][10],smg[4][4],lo[4],hi[4],su[4];
int po,ma,mi;
for(int i=0;i<4;i++)
{
hi[i]=16;
lo[i]=20;
}
for(int i=0;i<15;i++)
{
for(int j=0;j<10;j++)
{
scanf("%d",&g[i][j]);
}
}
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
scanf("%d",&smg[i][j]);
}
}
scanf("%d",&po);
for(int i=0;i<4;i++)
{
for(int j=3;j>=0;j--)
{
if(smg[j][i]==1)
{
lo[i]=4-j;
}
}
}
for(int i=0;i<4;i++)
{
for(int j=0;j<15;j++)
{
if(g[j][i+po-1]==1)
{
hi[i]=j;
}
}
}
for(int i=0;i<4;i++)
{
ma=16;
mi=4;
su[i]=lo[i]+hi[i];
if(su[i]<ma)
{
ma=su[i];
}
if(lo[i]<mi)
{
mi=lo[i];
}
}
ma=ma-mi-1;
for(int i=po-1;i<po+3;i++)
{
for(int j=ma,k=mi;j>ma-5+mi;j--,k++)
{
if(g[j][i]==0&&smg[k][i-po+1]==1)
{
g[j][i]=1;
}
}
}
for(int i=0;i<15;i++)
{
for(int j=0;j<9;j++)
{
printf("%d ",g[i][j]);
}
printf("%d\n",g[i][9]);
}
return 0;
}
然而似乎wa了,尴尬,本想自己看看的,但还是放弃了,还是自己写吧
细节,还是细节问题,数组界限与坐标,大脑一定要清晰
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
int screen[20][20];
int block[4][4];
int hig[20];
int low[4];
int main()
{
memset(hig,0,sizeof(hig));
for(int i=0;i<4;i++)
{
low[i] = 99;
}
for(int i=15;i>=1;i--)
{
for(int j=1;j<=10;j++)
{
scanf("%d",&screen[i][j]);
if(screen[i][j] == 1&&hig[j] == 0)
{
hig[j] = i;
}
}
}
for(int i=3;i>=0;i--)
{
for(int j=0;j<4;j++)
{
scanf("%d",&block[i][j]);
if(block[i][j] == 1)
{
low[j] = i;
}
}
}
bool emp = true;
for(int j=0;j<4;j++)
{
if(low[j] < 99)
{
emp = false;
break;
}
}
int beg;
scanf("%d",&beg);
if(!emp)
{
int sto = -99;
for(int j=0;j<4;j++)
{
if(hig[j+beg]-low[j]>sto)
{
sto = hig[j+beg]-low[j];
}
}
sto++;
for(int i=sto;i<sto+4;i++)
{
if(i<=0)
{
continue;
}
if(i>15)
{
break;
}
for(int j=0;j<4;j++)
{
screen[i][beg+j] |= block[i-sto][j];
}
}
}
for(int i=15;i>=1;i--)
{
for(int j=1;j<10;j++)
{
printf("%d ",screen[i][j]);
}
printf("%d\n",screen[i][10]);
}
return 0;
}
文章地址:http://blog.csdn.net/owen_q/article/details/78208071