2016.8.4 夏令營開營測試感想

題目+我的答案+我的考後感想

 

音階(ljestvica/1S/64M)
【題目描述】
Veronica進入了音樂學院。她收到了一張只有音符沒有註釋的樂譜,需要認出樂譜中用到的音階。在本題中,我們只用到了兩種最常用的(而且也是學校最先教的)音階:A小調和C大調。這並不是說這兩個音階比其他大調、小調更簡單或基礎, 所有的小調和大調都是差不多的。

現代音樂中一個八度有12個音(A, A#, B, C, C#, D, D#, E ,F, F#, G, G#),A小調和C大調也是用這12個音組成。A小調是一組有序的七個音{A,B,C,D,E,F,G},C大調是{C,D,E,F,G,A,B}。

注意,這兩個音階用到的音是一樣的。那區別在哪?確定一個音階,重點不僅在用到了什麼音,還有他們的用法。主音(一個音階的第一個音),                                                                                                                                 下屬音(第四個音),屬音(第五個音)在一個音階中是重音的首選。在A小調中就是A、D、E,在C大調中就是C、F、G。我們把這些音叫main tones。

大調和小調有什麼不同呢?比方說,A小調的中音(第三個音)比主音高三個半音,C大調的中音比主音高四個半音。總之,差別就在於兩個相鄰的音的距離。這使小調聽起來傷感,大調聽起來喜慶。

現在你要寫一個程序判斷這首曲子是用A小調寫的還是用C大調寫的。可以數在重音(每小節的第一個音)中是A小調的main tones多還是C大調的main tones多。如果main tones數相同,若最後一個音是A小調的main tones,這首曲子就是A小調,否則就是C大調。

比如說,現在來判斷著名的旋律“你在睡覺嗎?”;
CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C
字符“|”把每個小節隔開了,所以這個旋律的重音依次是:C,E,C,E,E,G,E,G,G,E,G,E,C,C,C,C。有10個C大調的main tones,6個A小調的main tones,所以這個旋律是C大調的。

【輸入格式】
輸入文件僅一行, 包含一個序列(最短爲5, 最長100), 每個字母都包含在{“A”, “B”, “C”, “D”, “E”, “F”, “G”, “|”} 中。 其中”|” 將每小節分開, 且不會出現在序列的開頭或結尾。

【輸出格式】
輸出文件僅一行,爲” C-dur “ (C大調) 或 “ A-mol” (A小調)。

【輸入1】
AEB|C
【輸出1】
C-dur
【輸入2】
CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C
【輸出2】
C-dur


 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std ;
int main()
{
	freopen("ljestvica.in","r",stdin);
	freopen("ljestvica.out","w",stdout);
	string st;
	cin>>st;
	bool flag=true;
	int a=0,c=0,len=st.size();
	for (int i=0;i<len;i++)
	{
		if (flag)
		{
			if (st[i]=='A'||st[i]=='D'||st[i]=='E')
				a++;
			if (st[i]=='C'||st[i]=='F'||st[i]=='G')
				c++;
			flag=false;
		}
		if (st[i]=='|')
			flag=true;
	}
	if (a<c) cout<<"C-dur"<<endl;
	if (a>c) cout<<"A-mol"<<endl;
	if (a==c)
		if (st[len-1]=='A'||st[len-1]=='D'||st[len-1]=='E')
			cout<<"A-mol"<<endl;
		else cout<<"C-dur"<<endl;
	
	return 0;
}


  這題其實就是一道水題,沒有什麼好解釋的。但是我被這題卡了一小會兒,還是影響了後面的作答。主要是因爲編譯器的原因,這個編譯器不完全,有bug。無論是什麼程序都編譯不了。搞得我還以爲是因爲我自己太久沒編程序或是自己太粗心的原因有一些小細節沒發現,結果搞了很久。最後還是憑着蹩腳的英文水平看出了問題所在。重新下載了編譯器,浪費了大量時間。所以我覺得考前調試編譯器也是一個重要的習慣。【血的教訓,很不爽

 

=========================================================

 

波老師(teacher/1S/64M)
【題目描述】
波波老師是一個地理老師。有一天他上課的時候,他在地圖上標記了N個點,第i個點在點(Xi,Yi)。他想知道,是否存在四個點(A,B,C,D)(A<B,C<D,A≠C或者B≠D),使AB之間的曼哈頓距離和CD之間的曼哈頓距離相等。
如果存在這樣的四個點,輸出YES,否則輸出NO。

【輸入格式】
輸入文件第一行是一個T(T≤50),表示有T組數據。
接下來有T組數據,每組數據第一行是兩個整數N,M,表示點的個數以及點的座標的邊界,然後有N行,第i行有兩個整數Xi,Yi表示第i個點的座標(Xi,Yi)(0≤Xi,Yi≤M)

【輸出格式】
輸出文件有T行,每一行爲YES或者NO。

【輸入】
2
3 10
1 1
2 2
3 3
4 10
8 8
2 3
3 3
4 4

【輸出】
YES
NO


 

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std ;
struct Tnode 
{
	int x,y;
};
Tnode node[100005];
bool cmp(Tnode a,Tnode b)
{
	return a.x<b.x||(a.x==b.x&&a.y<b.y);
}
long long sqr(int x)
{
	return x*x;
}
long long len(Tnode a,Tnode b)
{
	return sqr(b.x-a.x)+sqr(b.y-a.y);
}
int main()
{
	freopen("teacher.in","r",stdin);
	freopen("teacher.out","w",stdout);
	int T;
	cin>>T;
	for (int t=0;t<T;t++)
	{
		int n,m;
		cin>>n>>m;
		for (int i=0;i<n;i++)
			cin>>node[i].x>>node[i].y;
		sort(node,node+n,cmp);
		bool flag=false;
		for (int i=0;i<n-1&&!flag;i++)
			for (int j=i+1;j<n&&!flag;j++)
				for (int k=0;k<n-1&&!flag;k++)
					for (int l=k+1;l<n&&!flag;l++)
						if ((i!=k||j!=l)&&(len(node[i],node[j])==len(node[k],node[l])))
						{
							cout<<"YES"<<endl;
							flag=true;
						}
		if (!flag) cout<<"NO"<<endl;	
		
	}
	return 0;
}


  其實這題就更加氣了。我看了別人滿分的程序之後,簡直就是這個經典【emoji】表情啊!爲什麼是曼哈頓距離啊!蛇精病啊!我爲什麼要求直線距離啊!這道題也說明了,要仔細審題。【注:後加說明,M<200,000這也是很重要的一點,做題解的時候再講

 

=========================================================

 

爆裂吧世界(world/1S/64M)

【題目描述】
給你一個長度爲n的數列A,請你計算裏面有多少個四元組(a,b,c,d)滿足: 
a≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>Ad

【輸入格式】
輸入文件第一行有一個整數N,第二行有N個整數A1,A2⋯An

【輸出格式】
輸出文件僅一行,爲一個整數,表示滿足條件的四元組的數量

【輸入1】
4
2 4 1 3
【輸出1】
1
【輸入2】
4
1 2 3 4
【輸出2】
0
【數據約定】
15% n<=100    
100%n<=50000
A在int範圍裏


 

#include<iostream>
#include<cstdio>
using namespace std ;
int main()
{
	freopen("world.in","r",stdin);
	freopen("world.out","w",stdout);
	int a[10000];
	int n,ans=0;
	cin>>n;
	for (int i=0;i<n;i++)
		cin>>a[i];
	for (int i=0;i<n-1;i++)
		for (int j=i+1;j<n;j++)
			for (int k=0;k<n-1;k++)
				for (int l=k+1;l<n;l++)
					if (i!=k&&i!=l&&j!=k&&j!=l)
						if (a[i]<a[j]&&a[k]>a[l]) ans++;
	cout<<ans<<endl;
	return 0;
}


  沒多少時間給我多想了,我一開始就猜到是要用樹狀數組【看數據就知道是logN】但是沒有想到具體怎麼做,時間也不夠了,就隨便交了個暴力的算法,拿了個部分分。

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