查看: 5560|回復: 51
打印 上一主題 下一主題

[提問] npsc 2013試題 A. 挑食的大胃王

[複製鏈接]
  • TA的每日心情
    開心
    2014-9-28 12:10
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    34

    主題

    181

    帖子

    776

    積分

    高級會員

    Rank: 4

    積分
    776

    程式設計達人 - 2014新手達陣

    跳轉到指定樓層
    樓主
    發表於 2014-8-25 14:05:05 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    有誰會解這題




    執行時間1秒
    為了方便起見,老師的計算方法是先將便當切成以1 cm × 1 cm 為單位的小格子,每個格子不
    是阿力會吃就是阿力不會吃。對於阿力不吃的菜,老師假設阿力會挖掉的區域為不吃的食物所存
    在的格子與其上下左右相連的格子,對於所有會被挖掉的區域,阿力會挖掉3 cm 厚的白飯。示意
    圖如下,下圖是一個便當的表面,0 代表是阿力會吃的食物,1 代表是阿力不吃會挖掉的食物,灰
    色區域就是阿力所有會挖掉的區域,總共是18 cm2 ,因此阿力總共會挖掉18 × 3 = 54 cm3 的白
    飯。
    阿力可以食用的白飯量即為白飯原本的體積減掉被挖掉的白飯體積。
    因為市面上的便當琳瑯滿目,因此松板老師想請你幫忙寫個程式,協助計算各種便當小朋友可
    食用的白飯量是多少。

     輸入說明
    輸入的第一行有一個正整數T(T  100),代表測試資料的組數。
    每一組測試資料的第一行有三個正整數M,N,K (3  M,N,K  50) 分別以空白隔開。M 代
    表便當的長度,N 代表便當的寬度,K 代表便當的高度。
    接下來會有M 行,每行有N 個數字,分別以一個空白隔開,表示便當表面每一格是否是阿力
    會吃的食物。數字由0 與1 組成,0 代表是阿力會吃的食物,1 代表是阿力不吃會挖掉的食物。
     輸出說明
    對於每一筆測試資料請輸出一列,表示阿力可以食用的白飯量。

     範例輸入
    2
    9 10 5
    0 0 0 0 0 0 0 0 0 0
    0 1 1 1 0 0 0 0 0 0
    0 1 1 1 0 0 0 0 0 0
    0 1 1 1 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 1 1
    0 0 0 0 0 0 0 0 1 1
    0 0 0 0 0 0 0 0 1 1
    0 0 0 0 0 0 0 0 1 1
    0 0 0 0 0 0 0 0 1 1
    5 5 3
    0 0 0 0 0
    0 1 1 0 0
    0 0 0 1 1
    0 0 0 0 1
    0 0 1 0 0
     範例輸出
    336
    21






    我的程式碼
    不知哪裡有錯
    時間又超出限制
    [C++] 純文本查看 復制代碼
    #include<iostream>
    using namespace std;
    int main()
    {
            int t=0,m=0,n=0,k=0;
            cin>>t;
            int ans[t-1];
            bool yes=true;
            bool no=false;
            for(int times=0,ans_e=0;times<t;times++,ans_e++)
            {
                    cin>>m>>n>>k;
                    int rice[m][n],g=0,h=0,i=0;
                    for(int e=0;e<m;e++)
                    {
                            for(int f=0;f<n;f++)
                            {
                                    cin>>rice[e][f];
                            }
                    }
                    for(int e=0;e<m;e++)
                    {
                            for(int f=0;f<n;f++)
                            {
                                    if(rice[e][f] == 1)
                                    {
                                            rice[e][f]=2;
                                            //cout<<"rice["<<e<<"]["<<f<<"]"<<endl;
                                            rice[e-1][f]=2;
                                            //cout<<"rice["<<e-1<<"]["<<f<<"]"<<endl;
                                            rice[e][f-1]=2;
                                            //cout<<"rice["<<e<<"]["<<f-1<<"]"<<endl;
                                            if(rice[e+1][f] != 1)
                                            {
                                                    rice[e+1][f]=2;
                                                    //cout<<"rice["<<e+1<<"]["<<f<<"]"<<endl;
                                            }
                                            if(rice[e][f+1] != 1)
                                            {
                                                    //cout<<"rice["<<e<<"]["<<f+1<<"]"<<endl;
                                                    rice[e][f+1]=2;
                                            }
                                            
                                            i=k-3;
                                            
                                    }
                                    else //if(rice[e][f] == 0 && rice[e][f] != no)
                                    {
                                            rice[e][f]=0;
                                    }
                            }
                    }
                    
                    for(int e=0;e<m;e++)
                    {
                            for(int f=0;f<n;f++)
                            {
                                    if(rice[e][f]==2)
                                    {
                                            h++;
                                    }
                                    else
                                    {
                                            g=(m*n)-h;
                                    }
                                    //cout<<"rice["<<e<<"]["<<f<<"]"<<endl;
                                    //cout<<"g="<<g<<endl;
                                    //cout<<"h="<<h<<endl;
                            }
                            //cout<<endl;
                    }
                    //cout<<i<<endl;
                    cout<<(g*k)<<endl;
                    cout<<(i*h)<<endl;
                    ans[ans_e]=(g*k)+(i*h);
                    
            }
            
            for(int e=0;e<t;e++)
            {
                    cout<<ans[e]<<endl;
            }
            
            return 0;
    }
    

    另外
    "cin 輸入經測試發現速度遠慢於scanf 輸入"
    這甚麼意思



    By Sylveon
    請取一個適當標題


    林宇翔
    回復

    使用道具 檢舉

  • TA的每日心情
    開心
    2015-6-17 11:50
  • 簽到天數: 177 天

    [LV.7]常住居民III

    15

    主題

    315

    帖子

    1437

    積分

    金牌會員

    Rank: 6Rank: 6

    積分
    1437

    新手達陣台南一中資訊社

    25#
    發表於 2014-11-9 19:51:19 | 只看該作者
    本帖最後由 visitorIKC 於 2014-11-9 19:52 編輯
    林宇翔 發表於 2014-11-9 18:42
    這題如果這樣寫可以嗎?
    [mw_shl_code=cpp,true]#include
    #include

    根據我的不負責任評測機所輸出之結果,
    Wrong Answer on test 1.(line:5)
    Standard Answer: 56069
    Your Answer: 56054
    --------------------------------
    Process exited with return value 0
    Press any key to continue . . .

    UPD. Zerojudge 跑出
    (#2071516)
    第 1 測資點(0%): WA (line:3)
    答案不正确
    您的答案為: 377
    正確答案為: 380

    不知道我的評測機哪裡寫錯了
    不過你的code肯定有錯.
    目標:Taiwan Oranges-Integraled 2016 (TOI'16)台灣積分橘子。
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-9-28 12:10
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    34

    主題

    181

    帖子

    776

    積分

    高級會員

    Rank: 4

    積分
    776

    程式設計達人 - 2014新手達陣

    24#
     樓主| 發表於 2014-11-9 18:42:39 | 只看該作者
    這題如果這樣寫可以嗎?
    [C++] 純文本查看 復制代碼
    #include<iostream>
    #include<time.h>
    using namespace std;
    int main()
    {
        cin.tie( NULL );
    	int t=0;//宣告變數 
    	cin>>t;//讀入測資數量  
    	for(int times=0;times<t;times++)
    	{
    		int m=0,n=0,k=0;
    		int ans=0;
    		cin>>m>>n>>k;//m代表y軸,n代表x軸,k代表z軸
    		int rice[m][n];
    		for(int e=0;e<m;e++)//讀入測資 
    		{
    			for(int f=0;f<n;f++)
    			{
    			    cin>>rice[e][f];
    			}
    		}
    		for(int e=0;e<m;e++)//判斷上下左右或自己是1,計數器加一 
    		{
    			for(int f=0;f<n;f++)
    			{
    				if(rice[e][f]==1 || rice[e-1][f]==1 || rice[e+1][f]==1 || rice[e][f+1]==1)
    				{
    					ans++;
    					//cout<<ans<<'\n';
    				}
    				else if(f != 0 && rice[e][f]==0)
    				{
    					if(rice[e][f-1]==1)
    					{
    						ans++;
    						//cout<<ans<<'\n';
    					}
    				}
    				//cout<<"rice["<<e<<"]["<<f<<"]"<<'\n';
    			}
    		}
    		cout<<(m*n*k)-(ans*3)<<'\n';
    		
    	}
    	//cout<<clock();
    	return 0;
    }
    林宇翔
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-9-28 12:10
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    34

    主題

    181

    帖子

    776

    積分

    高級會員

    Rank: 4

    積分
    776

    程式設計達人 - 2014新手達陣

    23#
     樓主| 發表於 2014-8-26 10:58:04 | 只看該作者
    為什麼我重新整理跑麵包-3條

    點評

    你好。  發表於 2014-8-26 19:16
    人又不見了  發表於 2014-8-26 11:29
    林宇翔
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    22#
    發表於 2014-8-26 10:50:25 來自手機 | 只看該作者
    是的,在你不用sync with stdio時可以
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-9-28 12:10
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    34

    主題

    181

    帖子

    776

    積分

    高級會員

    Rank: 4

    積分
    776

    程式設計達人 - 2014新手達陣

    21#
     樓主| 發表於 2014-8-26 10:28:24 | 只看該作者
    printf
    是c的輸出
    但是它可以跟c++混在一起
    是這樣嗎?
    林宇翔
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    20#
    發表於 2014-8-25 18:40:15 | 只看該作者

    真糟糕,這東西可以解釋的很隨便,但是你有可能誤用,但是解釋得太詳細又要花時間。
    參考資料:
    http://www.cplusplus.com/reference/cstring/memset/
    http://jax-work-archive.blogspot.tw/2011/07/c-memset.html


    標頭 memory.h 不過通常用的是cstring
    函數原型: void * memset ( void * ptr, int value, size_t num );

    功能:可以快速設定一個連續的記憶體區塊(ex.陣列)的數值

    參數說明:
    ptr:作用對象的指標
    value:欲初始化的值
    num : 填充數量


    回傳值:
    ptr本身

    常見用法:
    1.把陣列所有元素都設定為0。
    在這範例裡,我們使用sizeof()運算子直接取得陣列所佔的記憶體大小。
    [C++] 純文本查看 復制代碼
    #include<iostream>
    #include<memory.h>
    using namespace std;
    
    int main()
    {
            int arr[5]= { 1,2,3,4,5 };
            
            memset( arr , 0 , sizeof(arr) );
            //sizeof(arr) = sizeof(int)*5
            for(int i=0;i<5;++i)
            {
                    cout<<arr[i]<<' ';
            }
    }


    要注意,填充的單位為「位元組」,所以在這裡的sizeof(arr)不等於5,而是等於5乘以每一個int所佔的位元組
    再這種用法中除了0之外,常用的還有-1,0x3F,0x7F,後兩個通常用來代表初始化為無限大

    點評

    http://forum.tfcis.org/thread-468-1-1.html  發表於 2014-8-25 18:47
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-9-28 12:10
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    34

    主題

    181

    帖子

    776

    積分

    高級會員

    Rank: 4

    積分
    776

    程式設計達人 - 2014新手達陣

    19#
     樓主| 發表於 2014-8-25 18:21:18 | 只看該作者
    人都不見了

    點評

    吃飯中...  發表於 2014-8-25 18:23
    林宇翔
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-9-28 12:10
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    34

    主題

    181

    帖子

    776

    積分

    高級會員

    Rank: 4

    積分
    776

    程式設計達人 - 2014新手達陣

    18#
     樓主| 發表於 2014-8-25 18:09:55 | 只看該作者
    memset
    是啥

    點評

    memset 你可以把它當成清空陣列的東西 詳細的內容以後再慢慢了解 吃飯ing~~~  發表於 2014-8-25 18:30
    林宇翔
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    17#
    發表於 2014-8-25 17:58:38 | 只看該作者
    不跟你喇了

    看最簡單的一點
    #code
  • cin>>t;//讀入測資數量
  • int ans[t-1];
  • 你自己想想,給你C99標準好了,你今天有t個答案,但是你只有t-1個格子放答案,你覺得這合理嗎? 更不用說陣列大小要是常數這件事了。

    點評

    我是因為陣列都從零開始計算 所以才想說用t-1個格子  發表於 2014-8-25 18:08
    哇~戳中盲點了  發表於 2014-8-25 18:00
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表