1. 程式人生 > >【USACO1.4】解題報告

【USACO1.4】解題報告

前言

本章主要考的是貪心和一些比較麻煩的模擬。難度相比上一章有很明顯的提升。但是稍微想一下還是可以想出來的(第五題除外,看了一下題解的思路)。
USACO:http://train.usaco.org


1.4.2.Mixing Milk

思路:

很明顯是一道貪心基礎題。肯定是要先買每單位價錢最便宜的,然後再依次買貴的。這個不用證明了吧。。。

程式碼:

/*
ID:ssl_zyc2
TASK:milk
LANG:C++
*/

#include <cstdio>
#include <algorithm>
#define N 5100
using
namespace std; int n,m,ans; struct node { int p,d; }a[N]; bool cmp(node x,node y) { return x.p<y.p; } int main() { freopen("milk.in","r",stdin); freopen("milk.out","w",stdout); scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) scanf("%d%d",&a[i].p,&a[i].d); sort(a+1,a+1
+m,cmp); //以價格排序 for (int i=1;i<=m;i++) if (a[i].d<n) //可以全部買完 { n-=a[i].d; //全部買完 ans=ans+a[i].d*a[i].p; } else { ans=ans+a[i].p*n; //將不夠的部分買完 break; } printf("%d\n",ans); return 0; }

1.4.3.Barn Repair

思路:

首先假設買一塊長度為第 n

n 個牛棚 - 1 1 個牛棚的木板,然後我們可以試著把這塊木板分成 k k 塊(也就是切割 k 1 k-1 次!),那麼最優的肯定是先將兩個牛棚之間距離最大的部分割掉,然後割掉第二大的。。。以此類推。
要特判可用木板數 &gt; &gt; 牛棚數的情況。

程式碼:

/*
ID:ssl_zyc2
TASK:barn1
LANG:C++
*/	

#include <cstdio>
#include <algorithm>
#define N 250
using namespace std;

int n,m,k,a[N],b[N],sum;

bool cmp(int x,int y)
{
	return x>y;
}

int main()
{
	freopen("barn1.in","r",stdin);
	freopen("barn1.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	if (n>=k)
	{
		printf("%d\n",k);
		return 0;
	}
	for (int i=1;i<=k;i++)
	 scanf("%d",&a[i]);
	sort(a+1,a+1+k);  
	sum=a[k]-a[1]+1;  //一塊木板
	for (int i=1;i<k;i++)
	 b[i]=a[i+1]-a[i];  //求出任意兩個相鄰的牛棚之間的距離
	sort(b+1,b+k,cmp);
	for (int i=1;i<n;i++)  //只能切n-1次!!!
	 sum=sum-b[i]+1;
	printf("%d\n",sum);
	return 0;
}

1.4.5.Prime Cryptarithm

思路:

由於每一個 “*” 只可能是 0 0 9 9 中的任意一個數字,那麼我們可以列舉乘數裡面的五個 &quot; &quot; &quot;*&quot; 分別是多少,然後就可以推出中間的六個 &quot; &quot; &quot;*&quot; 的值和答案的四個 &quot; &quot; &quot;*&quot; 的值。那麼久判斷每一個值是否合法即可。
時間複雜度: O ( n 5 ) O(n^5)

程式碼:

/*
ID:ssl_zyc2
TASK:crypt1
LANG:C++
*/

#include <cstdio>
#include <iostream>
using namespace std;

int n,a,b,ans;
bool p[11];

bool check(int x,int y)
{
	y++;
	while (x)
	{
		if (!p[x%10]) return 0;
		x/=10;
		y--;
		if (!y) return 0;
	}
	return 1;
}

int main()
{
	freopen("crypt1.in","r",stdin);
	freopen("crypt1.out","w",stdout);
	cin>>n;
	int x;
	for (int i=1;i<=n;i++)
	{
		cin>>x;
		p[x]=1;
	}
	for (int i=1;i<=9;i++)
	 if (p[i])
	  for (int j=0;j<=9;j++)
	   if (p[j])
	    for (int k=0;k<=9;k++)
	     if (p[k])
	      for (int l=1;l<=9;l++) 
	       if (p[l])
	        for (int q=0;q<=9;q++)  //列舉5個*
	         if (p[q])
	          if (check((i*100+j*10+k)*l,3))
	           if (check((i*100+j*10+k)*q,3))  //判斷中間的六個*
	            if (check((i*100+j*10+k)*(l*10+q),4))  //判斷積中的四個*
	             ans++;
	printf("%d\n",ans);
	return 0;
}

1.4.6.Combination Lock

思路:

暴力模擬。很簡單吧。。。
小心陣列越界。

程式碼:

/*
ID:ssl_zyc2
TASK:combo
LANG:C++
*/

#include <cstdio>
#define N 120
using namespace std;

int n,sum,a,b,c,d,e,f;
bool p[N][N][N];

int main()
{
	freopen("combo.in","r",stdin);
	freopen("combo.out","w",stdout);
	scanf("%d%d%d%d%d%d%d",&n,&a,&b,&c,&d,&e,&f);
	for (int i=a-2;i<=a+2;i++)
	 for (int j=b-2;j<=b+2;j++)
	  for (int k=c-2;k<=c+2;k++)  //第一個密碼
	   if (!p[(i+n-1)%n+1][(j+n-1)%n+1][(k+n-1)%n+1])
	   {
	   	  p[(i+n-1)%n+1][(j+n-1)%n+1][(k+n-1)%n+1]=1;
	   	  sum++;
	   }
	for (int i=d-2;i<=d+2;i++)
	 for (int j=e-2;j<=e+2;j++)
	  for (int k=f-2;k<=f+2;k++)  //第二個密碼
	   if (!p[(i+n-1)%n+1][(j+n-1)%n+1][(k+n-1)%n+1])
	   {
	   	  p[(i+n-1)%n+1][(j+n-1)%n+1][(k+n-1)%n+1]=1;
	   	  sum++;
	   }
	printf("%d\n",sum);
	return 0;
}

1.4.7.Wormholes

思路:

有點難度啊。
由於貝西只能往下走,那麼她所在位置的下面第一個蟲洞就是會被傳走的地方。
那麼設 n e x t [ i ] next[i] 表示在 i i 下面的第一個蟲洞( y y 座標要相同, x x 座標嚴格小於且最近)。然後就深搜,搜出配對的方案後就判斷是否成立。成立就記錄。

程式碼:

/*
ID:ssl_zyc2
TASK:wormhole
LANG:C++
*/

#include <cstdio>
using namespace std;

int f[15],next[15],n;

int check()
{
	for (int i=1;i<=n;i++)
	{
		int u=i;
		for (int j=1;j<=n;j++)
		 u=next[f[u]];  //是否死迴圈
		if (u) return 1;
	}
	return 0;
}

int dfs(int s)
{
	if (s==n/2) return check();  //搜好了
	int x;
	for (x=1;x<=n;x++)
	 if (!f[x]) break;  //沒有配對
	int ans=0;
	for (int i=1;i<=n;i++)
	 if (i!=x&&!f[i])
	 {
	 	f[x]=i;
	 	f[i]=x;
	 	ans+=dfs(s+1);
	 	f[x]=0;
	 	f[i]=0;
	 }
	return ans;
}

int main()
{
	freopen("wormhole.in","r",stdin);
	freopen("wormhole.out","w",stdout);
	scanf("%d",&n);
	int x[15],y[15];
	for (int i=1;i<=n;i++)
	 scanf("%d%d",&x[i],&y[i]);
	for (int i=1;i<=n;i++)
	 for (int j=1;j<=n;j++)
	  if (i!=j)
	   if (y[i]==y[j]&&x[j]>x[i]&&(!next[i]||x[next[i]]>x[j]))
	    next[i]=j;
	printf("%d\n",dfs(0));
	return 0;
}

1.4.8.Ski Course Design

思路:

由於山峰高度只有 100 100 ,那麼就可以列舉山峰最矮高度,然後再列舉每個山峰,如果不夠或高出那麼就計算所需費用。然後將所有費用取最小值即可。

程式碼:

/*
ID:ssl_zyc2
TASK:skidesign
LANG:C++
*/

#include <cstdio>
#include <algorithm>
#define N 1010
using namespace std;

int h[N]
            
           

相關推薦

USACO1.4解題報告

前言 本章主要考的是貪心和一些比較麻煩的模擬。難度相比上一章有很明顯的提升。但是稍微想一下還是可以想出來的(第五題除外,看了一下題解的思路)。 USACO:http://train.usaco.org 1.4.2.Mixing Milk 思路: 很明顯是一道貪心基礎

USACO1.3解題報告

前言 這一章主要考察的是一些簡單的數論和思維轉化能力。還是相對來說比較簡單的。 USACO:http://train.usaco.org 1.3.2.Milking Cows 思路: 字首和基礎題。 每次讀到有人在

USACO1.2解題報告

前言 以後將會不定期刷USACO的題目。每做完一小章會寫一份解題報告。這一小章裡面較簡單或者並不是很重要的題目就會直接放在裡面。而比較重要的題目就會單獨寫部落格,在這裡面放連結。 這一章很簡單,全部都是很基礎的題目。就直接在這裡面一筆帶過。 USACO:http://train.us

USACO1.5解題報告

前言 這章只有兩道題,但是質量都不比上一章低。 第一題正解肯定很難,但是資料神奇般的把 O (

USACO1.6解題報告

前言: 這章的三道題目中有兩道是可以用 D F S

USACO2.1解題報告

前言 USACO2.1主要內容是圖論。其中有幾道題是要用深搜做的。而另外幾道題則是利用模擬的方法來完成簡單圖論。 總體來說難度還是比較小的,算是最基礎的演算法吧。 UASCO:http://train.usaco.org 2.1.3.The Castle 題解

USACO2.2解題報告

前言 然而只有一道動態規劃的題目。。。 其他三道題都是模擬。。。 難度還是有所增加的。至少在洛谷中又有一道藍題了。 USACO:http://train.usaco.org USACO2.2.3.Preface Numbering 思路: 我們會發現羅馬數字中每一位都

USACO2.3解題報告

前言 本章主要是動態規劃,但是其中幾道題的方法比較多,我採用了其他的方法。 題目已經開始變難,有幾道題還特別值得思考。已經達到普及 T 3

洛谷 T28312 相對分子質量2018 6月月賽 T2 解題報告

字符 pac ... 給定 substr ++ 錯誤 如果 題目 T28312 「化學」相對分子質量 題目描述 做化學題時,小\(F\)總是裏算錯相對分子質量,這讓他非常苦惱。 小\(F\)找到了你,請你來幫他算一算給定物質的相對分子質量。 如果你沒有學過相關內容也沒有關系

校內賽 codeforces 827D最小生成樹樹鏈剖分 解題報告

找不到題面!! 題意 給出一張n(<=2e5)個點 m(<=2e5)條邊無向圖,保證有生成樹。對於每條邊,給出一個最大值maxLength,咦即能夠保證這條邊能夠出現在所有的最小生成樹中,邊權的最大值為maxLength(同時,其他所有邊長度不變

線上筆試題解題報告系列網易2017校招內推筆試之程式設計題持續更新

網易今年把內推筆試放在牛客網上辦,然後出了一批程式設計題。 題目在: 一共18個,好多(不同崗位抽3個不同的題的樣子)…… 慢慢寫吧,做一題寫一題。 以下題解將假定讀者有下列知識,對下面所列舉的細節不再贅述。 (如果有必要對此進行教學的,請站內信我) C/C++的基本

Google Kickstart Round_H解題報告

序 Problem A. Big Buttons 題意 一個長度為 nnn 的 01串,該字串有 mmm 個不能出現的字首,問這樣的字串有多少種? 題解 由於 n,mn,mn,m 的範圍很小,直接建

2018.3.28 AtCoder beginner092-C 解題報告(線性處理)

C - Traveling PlanTime limit : 2sec / Memory limit : 256MBScore : 300 pointsProblem StatementThere are N sightseeing spots on the x-axis,

Zhou Ping 's 解題報告為了有資格參加亞洲區ACM而奮鬥

 C  字串轉換 Accept:78     Submit:471 Time Limit:1000MS     Memory Limit:65536KB Description 我們將僅由若干個同一小寫字母構成的字串稱之為簡單串,例如"aaaa

leetcode 5040. 邊框著色解題報告

posit 整數 d+ perf src check 網格 orm poi 給出一個二維整數網格 grid,網格中的每個值表示該位置處的網格塊的顏色。 只有當兩個網格塊的顏色相同,而且在四個方向中任意一個方向上相鄰時,它們屬於同一連通分量。 連通分量的邊界是指連通分量中

leetcode 94. 二叉樹的中序遍歷解題報告

stack traversal roo tree order targe blank span etc 前往二叉樹的:前序,中序,後序 遍歷算法 方法一:遞歸 vector<int> res; vector<int>

leetcode 145. 二叉樹的後序遍歷解題報告

中序 stack mage blank res tor tac 前序 top 前往二叉樹的:前序,中序,後序 遍歷算法 方法一:遞歸 vector<int> res; vector<int> postorderTrave

leetcode 968. 監控二叉樹解題報告[待完善...]

由於 camera 需要 spa alt img 狀態 數量 turn 方法一:遞歸 // 0:該節點安裝了監視器 1:該節點可觀,但沒有安裝監視器 2:該節點不可觀 int monitor = 0; int state(TreeNod

leetcode 106. 從中序與後序遍歷序列構造二叉樹解題報告

++ amp src 圖片 ima 遍歷序列 tree cto 建立 前往 中序,後序遍歷構造二叉樹, 中序,前序遍歷構造二叉樹 TreeNode* build(vector<int>& inorder, int l1, int r1,

leetcode 105. 從前序與中序遍歷序列構造二叉樹解題報告

nullptr treenode ref != 圖片 lan size htm amp 前往 中序,後序遍歷構造二叉樹, 中序,前序遍歷構造二叉樹 TreeNode* build(vector<int>& preorder, int l