这是我第一参加ccf的题,第一次参加就做了三题,虽然分没拿全,但也确实可喜可贺,然而代码已无存,无妨,再做一次又如何,当年做了5h,看现在自己进步了多少吧
感觉还可以,5min,a题,20min,b题,最后总耗时1h左右成功三题,相比于之前,进步还是相当可观的,加油
201609-1 最大波动
思路:这题又是水题,扫一遍数组,统计一下最大值就好了
#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 myabs(int a)
{
if(a<0)
{
a *= (-1);
}
return a;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int la,now;
int maxchange = 0;
scanf("%d",&la);
for(int i=1;i<n;i++)
{
scanf("%d",&now);
if(myabs(now-la)>maxchange)
{
maxchange = myabs(now-la);
}
la = now;
}
printf("%d\n",maxchange);
}
return 0;
}
201609-2 火车购票
思路:预处理每排最大连续座位,模拟安排策略就好了,最后注意一下把座位转化成座位号,对于连续座位的维护,因为n特别小,每次更改都O(n)暴力维护一下就好了
#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;
bool seat[20][5];
int maxseat[20];
int main()
{
memset(seat,false,sizeof(seat));
for(int i=0;i<20;i++)
{
maxseat[i] = 5;
}
int n;
scanf("%d",&n);
while(n--)
{
int p;
scanf("%d",&p);
int lin;
for(lin=0;lin<20;lin++)
{
if(maxseat[lin]>=p)
{
int st;
for(st=0;st<5;st++)
{
int row;
for(row=0;row<p;row++)
{
if(seat[lin][st+row])
{
break;
}
}
if(row == p)
{
break;
}
}
for(int row=0;row<p;row++)
{
seat[lin][st+row] = true;
if(row==p-1)
{
printf("%d\n",lin*5+st+row+1);
}
else
{
printf("%d ",lin*5+st+row+1);
}
}
int realnowmaxseat = 0;
int nowmaxseat = 0;
for(int row=0;row<5;row++)
{
if(!seat[lin][row])
{
nowmaxseat++;
}
else
{
if(nowmaxseat>realnowmaxseat)
{
realnowmaxseat = nowmaxseat;
}
nowmaxseat = 0;
}
}
if(nowmaxseat>realnowmaxseat)
{
realnowmaxseat = nowmaxseat;
}
maxseat[lin] = realnowmaxseat;
break;
}
}
if(lin == 20)
{
for(int i=0;p>0&&i<20;i++)
{
for(int j=0;p>0&&j<5;j++)
{
if(!seat[i][j])
{
seat[i][j] = true;
p--;
if(p==0)
{
printf("%d\n",i*5+j+1);
break;
}
else
{
printf("%d ",i*5+j+1);
}
int realnowmaxseat = 0;
int nowmaxseat = 0;
for(int row=0;row<5;row++)
{
if(!seat[i][row])
{
nowmaxseat++;
}
else
{
if(nowmaxseat>realnowmaxseat)
{
realnowmaxseat = nowmaxseat;
}
nowmaxseat = 0;
}
}
if(nowmaxseat>realnowmaxseat)
{
realnowmaxseat = nowmaxseat;
}
maxseat[i] = realnowmaxseat;
}
}
}
}
}
return 0;
}
201609-2 炉石传说
思路:建立一个随从数据结构,将英雄处理为第0个随从,并将死亡的随从攻击了记为0,同样是n十分小,每次都O(n)模拟即可,然而细心最关键,为了确保攻击的正确性,还是再开一个数组来记录人数为妙
#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;
typedef struct FOLLOWER
{
int health;
int attack;
}Follower;
Follower f[2][10];
int num[2] = {0,0};
int main()
{
int n;
scanf("%d",&n);
//memset(f,-1,sizeof(f));
f[0][0].health = 30;
f[0][0].attack = 0;
f[1][0].health = 30;
f[1][0].attack = 0;
//memset(fB,-1,sizeof(fB));
//cout << fA[0].attack << " " << fA[0].health << " " << fA[6].health << " " << fA[6].attack<<endl;
int now = 0;
while(n--)
{
char temp[10];
scanf("%s",temp);
if(strcmp(temp,"end")==0)
{
now = (now + 1) % 2;
}
else if (strcmp(temp,"summon")==0)
{
int pos;
scanf("%d",&pos);
for(int i=num[now];i>=pos;i--)
{
f[now][i+1] = f[now][i];
}
scanf("%d%d",&f[now][pos].attack,&f[now][pos].health);
num[now]++;
}
else
{
int a,b;
scanf("%d%d",&a,&b);
int nex = (now + 1) % 2;
f[now][a].health -= f[nex][b].attack;
f[nex][b].health -= f[now][a].attack;
if(f[now][a].health<=0)
{
for(int i=a;i<num[now];i++)
{
f[now][i] = f[now][i+1];
}
f[now][7].attack = -1;
f[now][7].health = -1;
num[now]--;
}
if(f[nex][b].health<=0)
{
if(b==0)
{
break;
}
for(int i=b;i<num[nex];i++)
{
f[nex][b] = f[nex][i+1];
}
f[nex][7].attack = -1;
f[nex][7].health = -1;
num[nex]--;
}
}
}
if(f[0][0].health <= 0)
{
printf("-1\n");
}
else if(f[1][0].health <= 0)
{
printf("1\n");
}
else
{
printf("0\n");
}
printf("%d\n",f[0][0].health);
int len1 = num[0];
/*for(len1=1;len1<=7;len1++)
{
if(f[0][len1].attack==-1)
{
break;
}
}
len1--;*/
printf("%d",len1);
for(int i=1;i<=len1;i++)
{
printf(" %d",f[0][i].health);
}
printf("\n");
printf("%d\n",f[1][0].health);
int len2 = num[1];
/*for(len2=1;len2<=7;len2++)
{
if(f[1][len2].attack==-1)
{
break;
}
}
len2--;*/
printf("%d",len2);
for(int i=1;i<=len2;i++)
{
printf(" %d",f[1][i].health);
}
printf("\n");
return 0;
}