申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/
顯示具有 模擬 標籤的文章。 顯示所有文章
顯示具有 模擬 標籤的文章。 顯示所有文章

2012年3月3日 星期六

USACO Feb12 Bronze Rope Folding 折繩子 題解


USACO 2012 February Contest, Bronze Division

Problem 1. Rope Folding




Problem 1: Rope Folding [Brian Dean, 2012] 
Farmer John has a long rope of length L (1 <= L <= 10,000) that he uses for various tasks around his farm. The rope has N knots tied into it at various distinct locations (1 <= N <= 100), including one knot at each of its two endpoints. 

FJ notices that there are certain locations at which he can fold the rope back on itself such that the knots on opposite strands all line up exactly with each-other:
  
Please help FJ count the number of folding points having this property. Folding exactly at a knot is allowed, except folding at one of the endpoints is not allowed, and extra knots on the longer side of a fold are not a problem (that is, knots only need to line up in the areas where there are two strands opposite each-other). FJ only considers making a single fold at a time; he fortunately never makes multiple folds. 

PROBLEM NAME: folding
INPUT FORMAT:
 * Line 1: Two space-separated integers, N and L.
 * Lines 2..1+N: Each line contains an integer in the range 0...L specifying the location of a single knot. Two of these lines will always be 0 and L. 

2012年2月27日 星期一

OI練習題 溶液模擬器 simulator

小 Y 太失敗了,他雖然在化學實驗課上拿來了很多溶液,但是還是沒有辦法配成想要的溶液,萬一倒錯了就沒有辦法挽回了,小 Y 遲遲不敢下手。
於是小 Y 到網上下載了一個溶液配置模擬器。溶液配置模擬器是這樣的程序:模擬器在電腦中構造一種虛擬溶液,然後你可以虛擬地向當前虛擬溶液中加入一定濃度一定質量的這種溶液,模擬器會快速地算出倒入後虛擬溶液的濃度和質量。當然,計算機最可愛的地方就是當你倒錯了可以撤銷。
模擬器的使用步驟是這樣的:
1. 為模擬器設置一個初始質量和濃度 V0 , C0% ( 0 ≤ C0≤100 )。
2. 進行一系列操作,模擬器支持兩種操作:
P(v,c) 操作:表示向當前的虛擬溶液中加入質量為 v 濃度為 c 的溶液;
Z 操作:撤銷上一步 P 操作。
但是,小 Y 不小心把模擬器弄丟了……,眼看考試迫在眉睫,小 Y 只能依靠你了。
輸入格式
第一行,兩個整數 V0 , C0 。
第二行,一個整數 n ,表示操作數( n ≤ 10000 )。
接下來 n 行,每行一條操作,格式為:
P v c 或 Z 。
之間用一個空格隔開,當只剩初始溶液的時候,再撤銷就沒有用了。
任意時刻質量不會超過 2 31 -1 。
輸出格式
n 行,每行兩個數 V i , C i , 其中 V i 為整數, C i 為實數(保留 5 位小數),之間用一個空格隔開。其中,第 i 行表示第 i 次操作以後的溶液質量和濃度。

2012年2月11日 星期六

POJ2739(Japan2005) 連續素數和 conprime 解題報告

 連續素數和   題目來源:Japan 2005 (POJ2739)


連結:http://poj.org/problem?id=2739


【問題描述】
一些正整數可以表示成一個或多個連續素數和的形式。那麼一個正整數可以表示成多少種連續素數和的形式呢?例如: 53 有 2 種連續素數和的形式分別是 5+7+11+13+17 和 53. 正整數 41 有 3 種連續素數和的形式: 2+3+5+7+11+13,11+13+17 和 41. 整數 3 只有一種連續素數和的形式就是 3 。 20 就不能表示成連續素數的和。
你的任務就是找出整數 N 能表示成的連續素數和的種數。

2012年1月25日 星期三

GZOI2011 Pack 解題報告


第一題(20分)
提交文件:Pack.exe
輸入文件:Pack.in
輸出文件:Pack.out
 
題目描述:
你在一個組合式傢俱廠工作,這種組合式傢俱由各種形狀不同的組件組成,例如:

1 三种不同形状的组件
這些組件生產出來後將被自動裝箱,組件按生產的次序落下,第一個組件落在箱子底部,其後的組件依次落下,直至組件接觸到之前裝入的組件或箱子底部。例如,假設組件按圖1從左至右的次序生產出來,裝箱結果將如圖2左所示。假如按圖1從右至左的次序生產出來,裝箱結果將如圖2右所示。
                 圖2 不同的生產次序導致兩種不同的裝箱結果
由於箱子高度有限,如圖2左,三個組件已經超過了箱子的高度,這種情況第三個組件及之後的組件需要用新的箱子來裝。
你的工作是為自動裝箱系統編寫程序,根據組件生產的次序,輸出裝完這些組件後,每個箱子的組件堆疊的高度。

GDOI2011 樂譜變調 music 解題報告

五、樂譜變調(30分 1-4資料5分,最後一個資料10分)
輸入文件:music.in
輸出文件:music.out
【問題描述】
大家應該聽過很多美妙動聽的歌曲,也曾經在卡拉OK中唱過不少歌曲。其實,很多歌曲的調子都經過了變調,因為很多歌曲原來的調子一般都偏高,需要把調適當降低,才適合一般人歌唱。現在請你編程解決這個變調的問題,把一個曲譜從原來的調子基礎上,升高或降低若干個調,變成一個新的曲譜。
【音階】
相信大家都見過電子琴,也聽過電子琴,琴中的每個白色鍵,代表的是簡譜中的1,2,3,4,5,6,7的音階,用字母代表即為 C,D,E,F,G,A,B,見下圖:
此外,上面的黑鍵表示半音,按照上圖,從左邊到右邊的5個黑鍵代表的半音為:#C,#D,#F,#G,#A
由最左邊的音階C數起到第七個音階B,中間的黑鍵和鍵,均處於一個基準八度區域,在B右邊的琴鍵,比原來的音階高一個八度區域,稱為高八度區域; C音階左邊的琴鍵(圖片沒有顯示),比原來的音階低一個八度區域,稱為低八度區域。
【樂譜】
一個歌曲的樂譜,包括音階、節奏、小節線、休止符等元素,這裡為了簡單表示,只保留音階這一元素,節奏、小節線、休止符不在此題目中展現。
樂譜中的每個音階,可以用C,D,E,F,G,A,B,#C,#D,#F,#G,#A 表示。
在樂譜中會牽涉到八度區域的遷移問題,我們使用 “>”、“<” 來變化當前的八度區域。其中“>”表示提高當前八度區域(例如從低八度區域=>基準八度區域),“<”表示降低當前八度區域(例如高八度區域=>基準八度區域)。樂譜一開始的時候,當前八度區域為基準八度區域。
【樂譜變調】
對一個樂譜,提高或者降低N個半音的操作,成為樂譜變調。
首先,對於一個八度區域中,以下音階均相隔一個半音。
C,#C,D,#D,E,F,#F,G,#G,A,#A,B
然後,B音階比高它一個八度區域的C音階,相隔一個半音
變調就是一個簡單的升降音階的操作,只要數著半音階個數修改音階即可。例如,C音階提高6個半音,數過去就是#F,B音階提高4個音階,則為下一個八度區域的 #D 音階,同理,#F降6個半音階(升-6個半音)則為C。
【輸入格式】
輸入第一行字元串,包含上面的各個音階,以及>/<符號,表示一個樂譜,樂譜字元串長度<=200,沒有空格和其他字元串。
輸入第二行為整數N (-16<=N<=16) ,表示升多少個半音
【輸出格式】
輸出為一行字元串,代表樂譜。
【輸入樣例】
CDEFGAB>C
2
【輸出樣例】
DE#FGAB>#CD

【分析】
看著題目挺花哨,其實很簡單,就是一個模擬,只要讀請題目一般都能滿分。

【我的代碼】

C++语言: Codee#25363
001 /*
002 *Problem: GDOI2011 Music
003 *Author: Yee-fan Zhu
004 *Email: zyfworks@gmail.com
005 */
006 #include <cstdlib>
007 #include <iostream>
008 #include <cstdio>
009 #include <cstring>
010 using namespace std;
011 int N;
012
013 int num[300];
014 int M=0;
015
016 int Hash(char a,char b)
017 {
018     if(a=='C' && b=='0') return 1;
019     if(a=='#' && b=='C') return 2;
020     if(a=='D' && b=='0') return 3;
021     if(a=='#' && b=='D') return 4;
022     if(a=='E' && b=='0') return 5;
023     if(a=='F' && b=='0') return 6;
024     if(a=='#' && b=='F') return 7;
025     if(a=='G' && b=='0') return 8;
026     if(a=='#' && b=='G') return 9;
027     if(a=='A' && b=='0') return 10;
028     if(a=='#' && b=='A') return 11;
029     if(a=='B' && b=='0') return 12;
030     return 0;
031 }
032
033 void print(int a)
034 {
035     if(a==1) printf("C");
036     if(a==2) printf("#C");
037     if(a==3) printf("D");
038     if(a==4) printf("#D");
039     if(a==5) printf("E");
040     if(a==6) printf("F");
041     if(a==7) printf("#F");
042     if(a==8) printf("G");
043     if(a==9) printf("#G");
044     if(a==10) printf("A");
045     if(a==11) printf("#A");
046     if(a==0) printf("B");
047 }
048
049 void init()
050 {   
051     char str[300];
052     scanf("%s\n%d\n",&str,&N);
053     int len=strlen(str);
054     int top=0;
055     int now=2;
056     while(top<len)
057     {
058         char c=str[top];
059         if(c=='#')
060         {
061             int res=(now-1)*12+Hash(c,str[top+1]);
062             num[++M]=res;
063             top+=2;
064             continue;
065         }
066         if(c=='>')
067         {
068             now++;
069             top++;
070             continue;
071         }
072         if(c=='<')
073         {
074             now--;
075             top++;
076             continue;
077         }
078        
079         int res=(now-1)*12+Hash(c,'0');
080         num[++M]=res;
081         top++;
082         continue;
083     }
084 }
085
086 void work()
087 {
088     for (int i=1;i<=M;i++)
089         num[i]+=N;
090     int now=2;
091     int up=25;
092     int down=12;
093     for(int i=1;i<=M;i++)
094     {
095         int tmp=num[i];
096         if(tmp<=down)
097         {
098             now--;
099             down-=12;
100             up-=12;
101             printf("<");
102             print(tmp%12);
103             continue;
104         }
105         if(tmp>=up)
106         {
107             now++;
108             down+=12;
109             up+=12;
110             printf(">");
111             print(tmp%12);
112             continue;
113         }
114         print(tmp%12);
115     }
116 }
117
118 int main()
119 {
120     freopen("music.in","r",stdin);
121     freopen("music.out","w",stdout);
122     init();
123     work();
124     return 0;
125 }

2012年1月17日 星期二

[數論]OI練習題:最優分解方案 best 解題報告

[問題描述]
經過第一輪的遊戲,不少同學將會獲得聖誕特別禮物,但這時細心的數學課代表發現了一個問題:留下來的人太多而使禮物數量可能不夠,為此,加試了一道數學題:將一個正整數 n 分解成若干個互不相等的正整數的和,使得這些數的乘積最大,當主持人報出一個 n 後,請你立即將這個最大值報出來,現請你幫你的好友編一個程序來解決這個問題。

2011年11月28日 星期一

GZOI2011廣州NOI省選:簡易計算器 calculator 解題報告

【問題描述】相信大家都用過計算器,一般來說,計算機都可以計算簡單的加、減、乘、除這幾種運算。簡易計算器的功能和一般的計算器一樣,只是它更加簡單,只能處理整數運算,也就是說,它沒有小數點按鈕,並且它的除法運算是整除運算。現在,我們給出簡易計算器上的按鈕序列,請你編程序,模擬簡易計算器的功能,輸出最終的結果。
      
【計算器組成】簡易計算器由以下按鈕組成:數字按鈕: 0 1 2 3 4 5 6 7 8 9運算按鈕: + - * /等於號按鈕:=正負轉換按鈕:+/-為了表述方便,+/- 按鈕用 F 表示 ,
 
【計算器邏輯處理】
    
計算器內存有3個值,M1,M2,OP,STM1為計算器的左運算值,初始值為0M2為計算器的右運算值,初始值0OP為計算器的當前運算符,初始值為空ST為狀態標記,初始值為0
 
狀態裝換邏輯如下:
 
ST=0 (M1/OP輸入態):顯示值:M1
 
輸入數字N :M1=N ,轉 ST=1狀態
 
輸入F :M1=-M1,轉 ST=0狀態
 
輸入運算符:OP=運算符,轉ST=2狀態
 
輸入“=”:轉 ST=0狀態
 
ST=1 (M1+/OP輸入態):顯示值:M1
 
輸入數字N :如果M1>=0則 M1=M1*10+N 否則M1=M1*10-N;轉 ST=1狀態;
 
輸入F :M1=-M1,轉 ST=1狀態;
 
輸入運算符:OP=運算符,轉ST=2狀態
 
輸入“=”:轉 ST=0狀態
 
ST=2 (OP/M2輸入態):顯示值:M1
 
輸入數字N:M2=N,轉ST=3狀態;輸入F:M2=0,轉 ST=3狀態;
 
輸入運算符:OP=運算符,轉ST=2狀態
 
輸入“=”:
 
轉 ST=0狀態
 
ST=3 (M2+/OP輸入態):顯示值:M2
 
輸入數字N:如果M2>=0則 M2=M2*10+N 否則M2=M2*10-N;轉ST=3狀態;輸入F:M2=-M2,轉 ST=3狀態;
 
輸入運算符:M1=[M1][OP][M2] 的值OP=運算符;轉ST=2狀態
 
輸入“=”: M1=[M1][OP][M2] 的值轉ST=0狀態
 
【輸入格式】輸入只有一行,表示在計算器輸入的按鈕,長度<=100,裡面只包含如下字符 :0123456789+-*/=F輸入數據保證不會出現除以0的情況,運算過程中各個內存的值的範圍在[-10000000, 10000000] 以內

 
【輸出格式】
    
輸出包含一行整數,表示最後在計算器顯示的結果
 
【輸入樣例】
        
123=*2F-+/3+-=
        
【輸出樣例】
 
-82


 【分析】
字符串處理題目,由於各種狀態之間的來回跳換,所以用遞歸實現比較方便。由於數據不大,暴力的遞歸不成問題。

時間複雜度:O(length)。
            length表示字符串的長度。


 【我的代碼】
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
char str[102];
int OP;
int top=0;
int M1=0,M2=0;
int show;
int len;
int tmp;
void deal0();
void deal1();
void deal2();
void deal3();

int Getop(char op)
{
    if(op=='+')
        return 1;
    if(op=='-')
        return 2;
    if(op=='*')
        return 3;
    if(op=='/')
        return 4;
    if(op=='F')
        return 5;
    if(op=='=')
        return 6;
    return 0;
}

void check()
{
    if(top==len)
    {
        printf("%d\n",show);
        exit(0);
    }
    return;
}

void deal0()
{
    show=M1;
    check();
    tmp=0;
    if(Getop(str[top])==0)
    {
        while(Getop(str[top])==0 &&top<len)
        {
            tmp=tmp*10+str[top]-'0';
            top++;
        }
        M1=tmp;
        deal1();
        return;
    }
    if(Getop(str[top])==5)
    {
        M1=-M1;
        top++;
        deal0();
        return;
    }
    if(Getop(str[top])>=1 && Getop(str[top])<=4)
    {
        OP=Getop(str[top]);
        top++;
        deal2();
        return;
    }
    if(Getop(str[top])==6)
    {
        top++;
        deal0();
        return;
    }
}

void deal1()
{
    show=M1;
    check();
    tmp=0;
    if(Getop(str[top])==0)
    {
        while(Getop(str[top])==0 && top<len)
        {
            tmp=tmp*10+str[top]-'0';
            top++;
        }
        if(M1>=0)
            M1=M1*10+tmp;
        else
            M1=M1*10-tmp;
        deal1();
        return;
    }
    if(Getop(str[top])==5)
    {
        M1=-M1;
        top++;
        deal1();
        return;
    }
    if(Getop(str[top])>=1 && Getop(str[top])<=4)
    {
        OP=Getop(str[top]);
        top++;
        deal2();
        return;
    }
    if(Getop(str[top])==6)
    {
        top++;
        deal0();
        return;
    }
}

void deal2()
{
    show=M1;
    check();
    tmp=0;
    if(Getop(str[top])==0)
    {
        while(Getop(str[top])==0 && top<len)
        {
            tmp=tmp*10+str[top]-'0';
            top++;
        }
        M2=tmp;
        deal3();
        return;
    }
    if(Getop(str[top])==5)
    {
        M2=0;
        top++;
        deal3();
        return;
    }
    if(Getop(str[top])>=1 && Getop(str[top])<=4)
    {
        OP=Getop(str[top]);
        top++;
        deal2();
        return;
    }
    if(Getop(str[top])==6)
    {
        top++;
        deal0();
        return;
    }
}

void deal3()
{
    show=M2;
    check();
    tmp=0;
    if(Getop(str[top])==0)
    {
        while(Getop(str[top])==0 && top<len)
        {
            tmp=tmp*10+str[top]-'0';
            top++;
        }
        if(M2>=0)
            M2=M2*10+tmp;
        else
            M2=M2*10-tmp;
        deal3();
        return;
    }
    if(Getop(str[top])==5)
    {
        M2=-M2;
        top++;
        deal3();
        return;
    }
    if(Getop(str[top])>=1 && Getop(str[top])<=4)
    {
        if(OP==1)
            M1=M1+M2;
        if(OP==2)
            M1=M1-M2;
        if(OP==3)
            M1=M1*M2;
        if(OP==4)
            M1=M1/M2;
        OP=Getop(str[top]);
        top++;
        deal2();
        return;
    }
    if(Getop(str[top])==6)
    {
        top++;
        //deal0();
        if(OP==1)
            M1=M1+M2;
        if(OP==2)
            M1=M1-M2;
        if(OP==3)
            M1=M1*M2;
        if(OP==4)
            M1=M1/M2;
        deal0();
        return;
    }
}

void init()
{
    std::ios::sync_with_stdio(false);
    scanf("%s\n",&str);
    len=strlen(str);
    return;
}

int main()
{
    freopen("calculator.in","r",stdin);
    freopen("calculator.out","w",stdout);
    init();
    deal0();
    return 0;
}
 

 
 【評測結果】

正在连接评测机...

已连接到评测机
GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty
正在编译...
编译成功

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 20 0.000 s 275 KB 0
2 正确 20 0.000 s 275 KB 0
3 正确 20 0.000 s 275 KB 0
4 正确 20 0.000 s 275 KB 0
5 正确 20 0.000 s 275 KB 0
运行完成
运行时间 0.002 s
平均内存使用 275 KB
测试点通过状况 AAAAA
得分:100
恭喜你通过了全部测试点!

2011年11月26日 星期六

NOIP2011普及組 複賽 解題報告

pdf試題下載
1.數字反轉 reverse
【問題描述】
給定一個整數,請將該數各個位上數字反轉得到一個新數。新數也應滿足整數的常見形式,即除非給定的原數爲零,否則反轉後得到的新數的最高位數字不應爲零(參見樣例2)。
【輸入】
輸入文件名爲reverse.in。
輸入共1 行,一個整數N。
【輸出】
輸出文件名爲reverse.out。
輸出共1 行,一個整數,表示反轉後的新數。
【輸入輸出樣例1】
reverse.in
123
reverse.out
321
【輸入輸出樣例2】
reverse.in
-380
reverse.out
-83
【數據範圍】
-1,000,000,000 ≤ N≤ 1,000,000,000。

【分析】
普及組的水題,直接模擬即可。
注意:
   1.讀入時用字符串讀入。
   2.注意輸入“0”的情況。

【我的代碼】
C++语言: Codee#24218
//NOIP2011_Junior_reverse
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    freopen("reverse.in","r",stdin);
    freopen("reverse.out","w",stdout);
    char line[100]={'\0'};
    scanf("%s\n",&line);
    int s=0;
    int len=strlen(line);
    len--;
    if(line[0]=='0')
        printf("0\n");
    else
    {
        if(line[0]=='-')
        {
            s++;
            printf("-");
        }
        while(line[len--]=='0');
        for (int i=len+1;i>=s;i--)
            printf("%c",line[i]);
        printf("\n");
    }
    return 0;
}


【評測結果】

正在连接评测机...

已连接到评测机
GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty
正在编译...
编译成功

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 10 0.000 s 273 KB 0
2 正确 10 0.000 s 273 KB 0
3 正确 10 0.000 s 273 KB 0
4 正确 10 0.000 s 273 KB 0
5 正确 10 0.000 s 273 KB 0
6 正确 10 0.000 s 273 KB 0
7 正确 10 0.000 s 273 KB 0
8 正确 10 0.000 s 273 KB 0
9 正确 10 0.000 s 273 KB 0
10 正确 10 0.000 s 273 KB 0
运行完成
运行时间 0.003 s
平均内存使用 273 KB
测试点通过状况 AAAAAAAAAA
得分:100
恭喜你通过了全部测试点!

2.統計單詞數 stat
【問題描述】
一般的文本編輯器都有查找單詞的功能,該功能可以快速定位特定單詞在文章中的位置,有的還能統計出特定單詞在文章中出現的次數。
現在,請你編程實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章中的某一獨立單詞在不區分大小寫的情況下完全相同(參見樣例1),如果給定單詞僅是文章中某一單詞的一部分則不算匹配(參見樣例2)。
【輸入】
輸入文件名爲stat.in,2 行。
第1 行爲一個字符串,其中只含字母,表示給定單詞;
第2 行爲一個字符串,其中只可能包含字母和空格,表示給定的文章。
【輸出】
輸出文件名爲stat.out。
只有一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置(即在文章中第一次出現時,單詞首字母在文章中的位置,位置從0 開始);如果單詞在文章中沒有出現,則直接輸出一個整數-1。
【輸入輸出樣例1】
stat.in
To
to be or not to be is a question
stat.out
2 0
【輸入輸出樣例1 說明】
輸出結果表示給定的單詞To 在文章中出現兩次,第一次出現的位置爲0。
【輸入輸出樣例2】
stat.in
to
Did the Ottoman Empire lose its power at that time
stat.out
-1
【輸入輸出樣例2 說明】
表示給定的單詞to 在文章中沒有出現,輸出整數-1。
【數據範圍】
1 ≤ 單詞長度≤ 10。
1 ≤ 文章長度≤ 1,000,000。
 【分析】
這是NOIP2011複賽普及組中的第二道字符串處理題了~
讀入時都把大寫字母轉換成小寫,以方便判斷。
然後就很簡單了,直接暴力枚舉即可。
如果是string類,則之間用“=”號判等;如果是char型數組,用strcmp函數判等。


注意:
1.文章中空格有可能不止1個,要加以判斷。
2.只有strcmp函數返回0時才表示兩個字符數組相等。

【我的代碼】
C++语言: Codee#24217
//NOIP2011_Junior_stat
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
    freopen("stat.in","r",stdin);
    freopen("stat.out","w",stdout);
    char str[11];
    memset(str,'\0',sizeof(str));
    int len;
    cin>>str;
    len=strlen(str);
    for (int i=0;i<len;i++)
        str[i]=tolower(str[i]);
  
    string art;
    char tmp[1000001]={'\0'};
    int pos=-1;
    int tot=0;
    int tl;
    getline(cin,art);
    getline(cin,art);
    tl=art.length();
    for (int i=0;i<tl;i++)
        tmp[i]=art[i];
  
    int i=0;
    while(i<tl)
    {
        if(isalpha(tmp[i]))
        {
            int j=i;
            int k=0;
            char arr[1001]={'\0'};
            while(isalpha(tmp[j]))
            {
                arr[k]=tolower(tmp[j]);
                k++;
                j++;
            }
          
            if(strcmp(str,arr)==0)
            {
                tot++;
                if(pos==-1)
                    pos=i;
            }
            i=j+1;
        }
        else
            i++;
    }
  
    if(tot!=0)
        cout<<tot<<" "<<pos<<endl;
    else
        cout<<-1<<endl;
    return 0;
}



【評測結果】

正在连接评测机...

已连接到评测机
GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty
正在编译...
编译成功

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 10 0.001 s 1172 KB 0
2 正确 10 0.001 s 1172 KB 0
3 正确 10 0.001 s 1172 KB 0
4 正确 10 0.001 s 1168 KB 0
5 正确 10 0.003 s 1168 KB 0
6 正确 10 0.018 s 1176 KB 0
7 正确 10 0.018 s 1172 KB 0
8 正确 10 0.169 s 1172 KB 0
9 正确 10 0.167 s 1172 KB 0
10 正确 10 0.167 s 1176 KB 0
运行完成
运行时间 0.547 s
平均内存使用 1172 KB
测试点通过状况 AAAAAAAAAA
得分:100
恭喜你通过了全部测试点!


3.瑞士輪 swiss
【背景】
在雙人對決的競技性比賽,如乒乓球、羽毛球、國際象棋中,最常見的賽制是淘汰賽和循環賽。前者的特點是比賽場數少,每場都緊張刺激,但偶然性較高。後者的特點是較爲公平,偶然性較低,但比賽過程往往十分冗長。
本題中介紹的瑞士輪賽制,因最早使用於1895 年在瑞士舉辦的國際象棋比賽而得名。
它可以看作是淘汰賽與循環賽的折衷,既保證了比賽的穩定性,又能使賽程不至於過長。

【問題描述】
2*N 名編號爲1~2N 的選手共進行R 輪比賽。每輪比賽開始前,以及所有比賽結束後,都會按照總分從高到低對選手進行一次排名。選手的總分爲第一輪開始前的初始分數加上已參加過的所有比賽的得分和。總分相同的,約定編號較小的選手排名靠前。
每輪比賽的對陣安排與該輪比賽開始前的排名有關:第1 名和第2 名、第3 名和第4名、……、第2K – 1 名和第2K 名、…… 、第2N – 1 名和第2N 名,各進行一場比賽。每場比賽勝者得1 分,負者得0 分。也就是說除了首輪以外,其它輪比賽的安排均不能事先確定,而是要取決於選手在之前比賽中的表現。
現給定每個選手的初始分數及其實力值,試計算在R 輪比賽過後,排名第Q 的選手編號是多少。我們假設選手的實力值兩兩不同,且每場比賽中實力值較高的總能獲勝。
【輸入】
輸入文件名爲swiss.in。
輸入的第一行是三個正整數N、R、Q,每兩個數之間用一個空格隔開,表示有2*N 名選手、R 輪比賽,以及我們關心的名次Q。
第二行是2*N 個非負整數s1, s2, …, s2N,每兩個數之間用一個空格隔開,其中si 表示編號爲i 的選手的初始分數。
第三行是2*N 個正整數w1, w2, …, w2N,每兩個數之間用一個空格隔開,其中wi 表示編號爲i 的選手的實力值。
【輸出】
輸出文件名爲swiss.out。
輸出只有一行,包含一個整數,即R 輪比賽結束後,排名第Q 的選手的編號。
【輸入輸出樣例】
swiss.in
2 4 2
7 6 6 7
10 5 20 15
swiss.out
1
【輸入輸出樣例說明】


本輪對陣 本輪結束後的得分
選手編號 /
初始 / 7 6 6 7
第1 輪 ①—④ ②—③ 7 6 7 8
第2 輪 ④—① ③—② 7 6 8 9
第3 輪 ④—③ ①—② 8 6 9 9
第4 輪 ③—④ ①—② 9 6 10 9
【數據範圍】
對於30%的數據,1 ≤ N≤ 100;
對於50%的數據,1 ≤ N≤ 10,000;
對於100%的數據,1 ≤ N≤ 100,000,1 ≤ R≤ 50,1 ≤ Q≤ 2N,0 ≤ s1, s2, …, s2N ≤ 10^8,1 ≤ w1,
w2, …, w2N ≤ 10^8。

【分析】
這是普及組的一道難題。
首先,由於每輪比賽的次序都是由上一輪比賽完後的比分決定的,因此對於普及組的同學來說僅能使用模擬的方法來解決。容易想到的是每一輪模擬完以後快排一次,用這樣的方法,時間複雜度爲O(2Nlog2N*R),根據數據範圍可知這種思路僅能解決50%的數據。因此我們需要一種更有效的方式。
分析題意後可以發現,對於每一輪比賽過後,每一位選手都會有一種狀態,贏了或者輸了,而每一位選手比賽前都是有序的,那麼對於所有在該輪比賽中贏了或者是輸了的選手,都是有序的。即每輪比賽後,我們可以以O(N)的效率獲得勝負選手的有序隊列,對於兩組有序序列,容易想到將兩組數列歸併,歸併的效率爲O(N),這樣,完成一輪比賽的效率從O(2Nlog2N*R)縮減至O(NR),根據數據範圍,這樣的程序是能夠在1秒內出解的。

【我的代碼】
C++语言: Codee#24224
/*
*Problem:NOIP2011_Junior_Swiss 瑞士輪
*Author:Yee-fan Zhu
*School:Henan Experimental High School
*Method:Merge,QuickSort
*Date:2011.11.26
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
class SWISS
{
public:
    int num;
    int val;
    int tot;
}P[200003];
int N,R,Q;

SWISS A[100001],B[100001];
int pa,pb;

int cmp(const void *a,const void *b)
{
    class SWISS *c=(class SWISS *)a;
    class SWISS *d=(class SWISS *)b;
    if(c->tot!=d->tot)
        return d->tot-c->tot;
    return c->num-d->num;
}

void init()
{
    scanf("%d %d %d\n",&N,&R,&Q);
    N*=2;
    for(int i=1;i<=N;i++)
    {   
        P[i].num=i;
        scanf("%d",&P[i].tot);
    }
   
    for(int i=1;i<=N;i++)
        scanf("%d",&P[i].val);
    qsort(P+1,N,sizeof(SWISS),cmp);
}

void merge()
{
    int p=0;
    int i=1,j=1;
    while(i<=N/2&&j<=N/2)
    {
        if(A[i].tot>B[j].tot)
        {
            P[++p]=A[i++];
            continue;
        }
        if(A[i].tot==B[j].tot)
        {
            if(A[i].num<B[j].num)
            {   
                P[++p]=A[i++];
                continue;
            }
            P[++p]=B[j++];
            continue;
        }
        P[++p]=B[j++];
    }
    while(i<=N/2) P[++p]=A[i++];
    while(j<=N/2) P[++p]=B[j++];
}

void work()
{
    for (int i=1;i<=R;i++)
    {
        int j=1;
        pa=0,pb=0;
        while(j<N)
        {
            if(P[j].val>P[j+1].val)
                P[j].tot++,A[++pa]=P[j],B[++pb]=P[j+1];
            else
                P[j+1].tot++,A[++pa]=P[j+1],B[++pb]=P[j];
            j+=2;
        }
        merge();
    }
   
    qsort(P+1,N,sizeof(SWISS),cmp);
    printf("%d\n",P[Q].num);
}

int main()
{
    freopen("swiss.in","r",stdin);
    freopen("swiss.out","w",stdout);
    init();
    work();
    return 0;
}
【評測結果】
正在连接评测机...

已连接到评测机
GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty
正在编译...
编译成功

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 10 0.000 s 4960 KB 0
2 正确 10 0.000 s 4960 KB 0
3 正确 10 0.001 s 4960 KB 0
4 正确 10 0.019 s 4960 KB 0
5 正确 10 0.047 s 4960 KB 0
6 正确 10 0.123 s 4960 KB 0
7 正确 10 0.254 s 4960 KB 0
8 正确 10 0.468 s 4960 KB 0
9 正确 10 0.543 s 4960 KB 0
10 正确 10 0.612 s 4960 KB 0
运行完成
运行时间 2.068 s
平均内存使用 4960 KB
测试点通过状况 AAAAAAAAAA
得分:100
恭喜你通过了全部测试点!