程序設計思維與實踐 CSP-M1

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;
}

總結:場上沒想到做法。。。暴力的,只考慮線的轉移了,沒怎麼考慮點的記錄,場上不要頹,認真想。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章