ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
這套題是我上周日, 就是前天打得一場組隊賽, 題目不太好找
題目鏈接:http://codeforces.com/gym/100861?在virtual judge 上也可以提交哦!
A ACM ICPC Rules:
題目大意: 有很多所高校參加預選賽, 并在預選賽取得了排名, 但是對于每所學校, 除了MSU有4個名額之外其他大學只有兩個名額( 也就是說, 只有每個大學的前2名進決賽(MSU前四名)&& 最多有10個隊伍進入決賽), 高中隊伍不能進入決賽。 給出預選賽的排名, 輸出可以進入決賽的名單,( 最多十個 )
題目分析: 這道題還是看題解出來的, 感覺自己做的題太少了, 很多題能做出來就是做的方法添麻煩, 所以以后要多做題夯實, 首先如果遇到"SCH"就continue, ?創建一個MAP<string, int>記錄每種字符串出現的次數, 再創建一個vector<pair<string, string>> V 儲存進入MSU 的排名。
?
#include <iostream> #include <vector> #include <string> #include <map> #include <algorithm> using namespace std;vector<pair<string, string>> V; map<string, int> MAP;int main() {int n;while( cin >> n ) {int lim = 0;for( int i = 1; i <= n; i++ ) {string a, b;cin >> a >> b;if( a == "SCH" ) continue;else {if( a == "MSU" ) lim = 4;else lim = 2;}if( MAP[a] < lim ) {MAP[a]++;V.push_back( make_pair( a, b ) );}}int ans1 = min( 10, (int)V.size() );cout << ans1 << endl;for( int i = 0; i < ans1; i++ ) {cout << V[i].first << " ";cout << V[i].second << endl;}}return 0; } View Code?
G? Genesis Project:
題目大意:給若干個點, 每兩個點會生成一個新的點, 位置是兩點連線的中點, 當前點都有"孩子"后當前點才會消失, 發生兩個點的位置正好的重合的情況的“繁殖次數”是多少?
題目分析: 首先要知道任意四邊形的中點一定是平行四邊形, 而平行四邊形對角連線的中點重合 , 所以說,當點數大于4的時候, 最多繁殖次數就為2!媽的這點要是想到早就做上來了, 還是太蠢, 做的題實在是太少!然后答案為1的就是一個點恰好在兩個點的中點的位置上, ( n >= 4 ) , 當只有 <= 3 個點的時候, 無論怎樣都不可能重合!( 但是有一種特殊情況就是三個點 , 其中一點是另外兩個點的中點, 這時本來應該輸出1的, 但是沒特殊處理也給過了(可能是數據水) )
然后再說一下怎么找到兩點重合, 首先建一個pair< int, int > P 的SET容器 , 來儲存點的x , y坐標, 然后將P 推入SET 中, 最后兩兩枚舉, 如果 SET.count( P ) == 1 就break掉然后輸出1; 如果 n <= 3 則輸出0 ; 其余的就用以上方法尋找, 如果尋找未果就輸出2~!
附上代碼:
#include <cstdio> #include <set> #include <algorithm> #include <cstring> using namespace std;set< pair< int, int > > S;pair< int, int > a[1004]; int n;int main() {scanf( "%d", &n );S.clear();memset( a, 0, sizeof( a ) );for( int i = 1; i <= n; i++ ) {scanf( "%d%d", &a[i].first, &a[i].second );}if( n <= 3 ) {printf( "0\n" );return 0;}for( int i = 1; i <= n; i++ ) {for( int j = i + 1; j <= n; j++ ) {pair< int, int > P;P = make_pair( a[i].first + a[j].first, a[i].second + a[j].second );if( S.count( P ) ) {printf( "1\n" );return 0;}S.insert( P );}}printf( "2\n" );return 0; } View Code?
L. Lucky Bonds:
題目大意:給出Lucky number 的定義, 對于前N個數字和后N個數字之和相等, 比如“1340” 1 + 3 = 4 + 0 則這個數字就是Lucky Number,顯然數字的位數為2 * N 。 輸入一個N, 求長度為2 * N ?最大連續非幸運數區間的左區間和右區間。?
?
題目分析: 這道題是個構造題, 但是首先看到N的范圍很小 , 1 ~ 10, 所以在想能不能打表將結果打出來, 暴力很簡單, 當N ?= 1 , 2, 3 的時候答案分別是 89, 98; 9899, 9998;
998999, 999998; 所以后面的結果直接打表出來就可以了, 代碼很丑。
?
然后就是構造方法, 很明顯這道題是一個special judge, 所以我以8 , 9為例, 來構造答案, 假設N = 3, ?右端點就是999998, 左端點就為從999998 往左數的第一個幸運數字后的非幸運數字( 有些拗口 , 但是仔細想想還是能想明白 ) ,后三位和為 9 + 9 + 8, 所以前三位只能是8 + 9 + 9 , 9 + 8 + 9, ?9 + 9 + 8 , 又因為9 9 8 組合是最靠近999998的( 向左數的第一個lucky number ) 所以構造方法就是, 左區間的端點值為第 N + 1 位為8, 其余為9 :
?
附上史上最丑的代碼,。。。。。。。。
?
#include <iostream> #include <cstdio> #include <cstring> #include <string> using namespace std;string ans[30] = {" ", " ","89", "98","9899", "9998","998999", "999998","99989999", "99999998","9999899999", "9999999998","999998999999", "999999999998","99999989999999", "99999999999998","9999999899999999", "9999999999999998","999999998999999999", "999999999999999998","99999999989999999999", "99999999999999999998" };int main() {int n;while( cin >> n ) {cout << ans[2*n] << endl << ans[2*n+1] << endl;}return 0; } View Code?
還有兩道題, 過段時間補全!?
轉載于:https://www.cnblogs.com/FriskyPuppy/p/5998386.html
總結
以上是生活随笔為你收集整理的ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是root?我来告诉你为什么它叫ro
- 下一篇: 身份验证协议和java安全框架