A.
题意:
一个字符串和一个转盘,一开始转盘指向a,问转盘指向完整个字符串的最小代价是多少。
字符串均为小写字母。
思路:简单模拟。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
char s[10010];
int main()
{
cin>>s+1;
int ans=0,last=1;
int n=strlen(s+1);
for(int i=1;i<=n;i++)
{
int x=s[i]-96;
ans+=min((x-last+26)%26,(last-x+26)%26);
last=x;
}
printf("%d",ans);
return 0;
}
B.
题意
思路:把每天的生煎数分为奇偶两类,一开始mod2先变成0 1 2 三种数,因为每一天都必须满足,所以从头枚举,记一下上一天有没有领券即可,中间出现0但有券或者最后一天还剩券则no 否则yes。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int a[100010],n;
bool flag=true,last;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
if(!a[i]||a[i]<0) {
if(last) flag=false;
continue;
}
if(last) a[i]--,last=false;
if(a[i]>2&&a[i]%2==0) a[i]=2;
if(a[i]>2&&a[i]%2==1) a[i]=1;
if(a[i]==1) last=true;
else last=false;
}
if(last) flag=false;
if(flag) printf("YES");
else printf("NO");
return 0;
}
总结:其实这题写炸了。。虽然只wa了一个点,但是其实问题很大,一定多造数据,多造数据。。。
C.
题意:
思路:DFS记忆化搜素,很容易发现,线段的数量非常多,大概有2^30,而点的数量不会太多,不会超过300*300,记忆化一下 ,记录每个点的位置,当前方向,还剩的步数,当前分裂到了第几次,就ok了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
bool b[31][301][301][6][9],s[301][301];
int n,a[40],tot,cut;
int dx[9]={0,1,1,0,-1,-1,-1,0,1};
int dy[9]={0,0,1,1,1,0,-1,-1,-1};
int ans;
void dfs(int t,int x,int y,int r,int f)
{
if(t>n) return ;
if(b[t][x][y][r][f]) return ;
if(!s[x][y]) ans++,s[x][y]=true;b[t][x][y][r][f]=true;
// for(int i=1;i<=a[t];i++)
{
if(r>=1) dfs(t,x+dx[f],y+dy[f],r-1,f);
else if(t<n){
int ff=f==1?8:f-1;
dfs(t+1,x+dx[ff],y+dy[ff],a[t+1]-1,ff);
ff=f%8+1;
dfs(t+1,x+dx[ff],y+dy[ff],a[t+1]-1,ff);
}
}
return;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(1,150,150,a[1]-1,3);
printf("%d",ans);
return 0;
}
总结:场上没想到做法。。。暴力的,只考虑线的转移了,没怎么考虑点的记录,场上不要颓,认真想。。。