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;
}
總結:場上沒想到做法。。。暴力的,只考慮線的轉移了,沒怎麼考慮點的記錄,場上不要頹,認真想。。。