t1 機器翻譯
t2 烏龜棋
t3 關押罪犯
t4 引水入城
題解:
一套不算太難的noip題目。
第一題直接暴力模擬佇列的工作即可。
#include
#include
#include
#include
#include
#include
using namespace std;
intq[10100];
int in()
int main()
if (!f)
}printf("%d\n",s);
return
0;}
第二題我寫的是 404
的dp,轉移方程顯然:
f[i][j][k][l]表示當前用了i張1步的,j張2步,k張3步,l張4步。
f[i][j][k][l]=max(f[i-1][j][k][l],f[i][j-1][k][l],f[i][j][k-1][l],f[i][j][k][l-1])+a[i+2×j+3×k+4×l]。
#include
#include
#include
#include
#include
#include
using
namespace
std;
int f[50][50][50][50]=,a[400],b[6];
int in()
int main()
printf("%d\n",f[b[1]][b[2]][b[3]][b[4]]);
return
0;}
第三題並查集,把所有的衝突按照值從大到小排序,然後每乙個衝突的兩端加進兩個不同的集合,直到出現衝突,此時這個衝突的值就是我們最終分配完後出現的最大的那個衝突值,輸出即可,如一直沒有衝突,就輸出0了。
#include
#include
#include
#include
#include
#include
using
namespace
std;
struct sa[100010];
int n,nn,m,fa[40010];
int in()
bool cmp(s a,s b)
int find(int x)
int main()
}printf("0\n");
return
0;}
第四題開始想到了正常解法,後來腦抽想去搞乙個最短路(**於費用流的啟發)。。於是頹了很久,後來還是寫了正常的做法。。寫完後去看了一下題解,發現好像真的可以跑最短路(囧。。)
說一下正常做法:
首先把第一行入隊,bfs一遍,看最後一行是否全都能訪問到,不能就直接輸出0和不能訪問的個數,否則就重新對於第一行的每個點dfs(bfs一樣。。懶的寫兩遍了。。)一遍,然後統計一下它能訪問到的最後一行的區間(這個一定是連續的,可以證明。。但我是腦補出來的。。),然後就是經典線段覆蓋的dp了。
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define n 1001000
#define m 600
struct qq[n];
struct ee[m];
int dx[6]=,dy[6]=;
int n,m,f[m],a[m][m]; bool vis[m][m];
int in()
void bfs();
vis[1][i]=true;
}while (hfor (int i=0; i<4; i++)
}}void init()
}void dfs(int xu,int x,int y)
for (int i=0; i<4; i++)
}void dp()
}int main()
dp(); printf("%d\n",f[m]);
return
0;}
NOIP 2010 普及組解題報告
題目分析 一 數字統計 此題,曾經在某oj上看到過原題。要求和實現都非常簡單。無非是,列舉出所有在範圍內的數字,然後對數字進行拆分,對每一位數字進行判斷。乙個樸素的for迴圈,巢狀乙個while迴圈,就可以解決這道題目。下面是程式的核心部分 for i l i r i 此題丟分,絕對可以認為是絕不應...
NOIP2010 烏龜棋 解題報告
小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...
NOIP 2010 普及組解題報告
題目分析 一 數字統計 此題,曾經在某oj上看到過原題。要求和實現都非常簡單。無非是,列舉出所有在範圍內的數字,然後對數字進行拆分,對每一位數字進行判斷。乙個樸素的for迴圈,巢狀乙個while迴圈,就可以解決這道題目。下面是程式的核心部分 for i l i r i t i while t 0 y...