1. 程式人生 > >沖刺Noip2017模擬賽8 解題報告——五十嵐芒果醬

沖刺Noip2017模擬賽8 解題報告——五十嵐芒果醬

.cn 其中 www. tex 我不 closed 必須 std -s

1、鼎紋

技術分享
【問題描述】
據說鼎紋的 種制造 式是 銅模印出來的,這是我國古代勞動 智慧
的結晶。銅模印過的地 ,會留下深深的印記,經過時間的煉化,洗
練成歷史的遺存。
聰明的古代勞動人民擁有一個 a 行 b 列的銅模,每個位置要麽是 0(代表
這個點是平的),要麽是 1(代表這個點是凸起的)。他們想造 個 n 行 m 列
的鼎 ,其中每個位置也都是 01,表示經過若幹 次印後,每個位置的結果。
有一些要求。銅模是不能旋轉和翻轉的;在印的過程當中,銅模的凸起不
能出現在鼎面的外面(平的部分是可以出現在外面的),鼎面上的同一個位置
不能被多個凸起印下(在任意兩次印時,鼎面上不存在一個點,使得這兩次都
有銅模上為 
1 的點覆蓋它)。 請你判斷這個鼎面能不能被印出來。 【輸入格式】 輸入文件件名為 grain.in。 本題多測。 第一行,一個整數 T ,表示測試 點數量。接下來 T 個測試點,每 個測試點中: 第一行包含 4 個整數 n,m,a,b。 接下來 n 行 ,每行 m 個字符,描述鼎面 。“0”表示 平,“1”表示凸起。接下來 a 行,每行 b 個字符, 描述銅模。“0”表示平,“1”表示凸起。 【輸出格式】 輸出 件名為 grain.out。 共有 T 行 ,對於每個測試點,輸出 “YES”(能)或“NO”(不能)。 【樣例】 grain.in 2 3 4 4 2 1100 0110 1100 10 01 10
00 2 2 2 2 11 11 01 10 grain.out YES NO 【數據規模與約定】 對於 70% 的數據,n,m,a, b <= 50。 對於 100% 的數據,1 <= T <=10; 1<=n,m, a, b <= 1000。 【問題描述】 據說鼎紋的 種制造 式是 銅模印出來的,這是我國古代勞動 智慧 的結晶。銅模印過的地 ,會留下深深的印記,經過時間的煉化,洗 練成歷史的遺存。 聰明的古代勞動人民擁有一個 a 行 b 列的銅模,每個位置要麽是 0(代表 這個點是平的),要麽是 1(代表這個點是凸起的)。他們想造 個 n 行 m 列 的鼎 ,其中每個位置也都是
01,表示經過若幹 次印後,每個位置的結果。 有一些要求。銅模是不能旋轉和翻轉的;在印的過程當中,銅模的凸起不 能出現在鼎面的外面(平的部分是可以出現在外面的),鼎面上的同一個位置 不能被多個凸起印下(在任意兩次印時,鼎面上不存在一個點,使得這兩次都 有銅模上為 1 的點覆蓋它)。 請你判斷這個鼎面能不能被印出來。 【輸入格式】 輸入文件件名為 grain.in。 本題多測。 第一行,一個整數 T ,表示測試 點數量。接下來 T 個測試點,每 個測試點中: 第一行包含 4 個整數 n,m,a,b。 接下來 n 行 ,每行 m 個字符,描述鼎面 。“0”表示 平,“1”表示凸起。接下來 a 行,每行 b 個字符, 描述銅模。“0”表示平,“1”表示凸起。 【輸出格式】 輸出 件名為 grain.out。 共有 T 行 ,對於每個測試點,輸出 “YES”(能)或“NO”(不能)。 【樣例】 grain.in 2 3 4 4 2 1100 0110 1100 10 01 10 00 2 2 2 2 11 11 01 10 grain.out YES NO 【數據規模與約定】 對於 70% 的數據,n,m,a, b <= 50。 對於 100% 的數據,1 <= T <=10; 1<=n,m, a, b <= 1000
題目

tag:模擬

思路:題意一定要看懂哦。用銅模的1去消除鼎的1,銅模的每個1都必須找到對應的,最後要保證鼎的1被消完。暴力模擬能拿60分。通過觀察我們發現,這個題目跟0沒有什麽關系,所以只要記錄1的位置。那麽消除呢,必須是兩個矩陣偏左上角的1為起始點,如果不這樣,就會有左上方多余的1沒被消除。每次默認這兩個1必須對上,然後用之前記錄的銅模其他的1與起始1的相對位置去找。記得每行讀入整個字符串不然scanf("%c")會T。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<cmath>
 6 #define maxn 1010 
 7 using namespace std;
 8 int T,n,m,a,b,cnt1,cnt2,mp[maxn][maxn],x[maxn*maxn],y[maxn*maxn],X[maxn*maxn],Y[maxn*maxn];
 9 char ch[maxn];
10 void init()
11 {
12     for(int i=1;i<=n;++i)
13         for(int j=1;j<=m;++j)
14             mp[i][j]=0; 
15     for(int i=1;i<=cnt1;++i) x[i]=y[i]=0; 
16     for(int i=1;i<=cnt2;++i) X[i]=Y[i]=0; 
17     cnt1=cnt2=0;
18 }
19 bool check(int xx,int yy)
20 {
21     mp[xx][yy]=0;
22     for(int i=2;i<=cnt2;++i){
23          int XX=xx+X[i],YY=yy+Y[i];
24          if(XX<1||XX>n||YY<1||YY>m||!mp[XX][YY]) return false; 
25          mp[XX][YY]=0; 
26     }
27     return true; 
28 }
29 void solve()
30 {
31     init(); 
32     scanf("%d%d%d%d",&n,&m,&a,&b);
33     for(int i=1;i<=n;++i){
34         scanf("%s",ch+1);
35         for(int j=1;j<=m;++j){
36             if(ch[j]-0){
37                 x[++cnt1]=i;
38                 y[cnt1]=j;
39                 mp[i][j]=1; 
40             } 
41         }
42     }
43         //記錄鼎的1 
44     for(int i=1;i<=a;++i){
45         scanf("%s",ch+1);
46         for(int j=1;j<=b;++j){
47             if(ch[j]-0){
48                 X[++cnt2]=i;
49                 Y[cnt2]=j; 
50             }
51         }//記錄模的1 
52     }
53     for(int i=2;i<=cnt2;++i){
54         X[i]-=X[1];
55         Y[i]-=Y[1]; 
56     }//模版的幾個1到第一個1的距離 
57     for(int i=1;i<=cnt1;++i)
58         if(mp[x[i]][y[i]])
59             if(!check(x[i],y[i])){
60                 puts("NO");
61                 return; 
62             }
63     puts("YES"); 
64 } 
65 int main()
66 {
67     //freopen("grain.in","r",stdin);
68     //freopen("grain.out","w",stdout);
69     scanf("%d",&T);
70     while(T--) solve(); 
71     return 0; 
72 } 

2、看球賽

技術分享
2200 年 裏奧迪奧帶領的十星巴西對戰萊昂納多帶領的阿根廷的世界杯決賽馬
上開始了!前來在巨型球場觀看比賽的觀眾數不甚數,但是由於突如其來的系統
原因,大家不能網上購票,只能到售票窗口,排成長龍買票. 按售票處規定,每一個限購一張門票,且每一張門票 50 美元。 在排成長龍的球
迷中有 n 個人手持 50 美元,另外有 n 個人手持 100 美元。假設售票處開始的時
候沒有零錢,試問這 2n 個球迷有多少種排隊方式使得售票處不會出現找不出錢
的尷尬局面,導致拖延球迷看球時間。
【輸入與輸出說明】
輸入兩行,第一行一個正整數 T,表示數據個數。
第二行有 T 個正整數,n1,n2,....nT. 輸出 T 行,每一行為被 10^9+7 模過的結果。
【樣例輸入1】 
1
2
【樣例輸出1】
2
【樣例輸入2】 
2
2 5
【樣例輸出2】
2
42
【樣例說明】
例如當 n=2 時,用 A 表示手持面值 50 美元的球迷,用 B 表示手持面值為 100 美
元的球迷,則最多可得到以下兩組不同的排隊方式使得售票處不會出現找不出錢
的情況。
售票處 A A B B
售票處 A B A B
【數據範圍】
對於 10% n <= 10, T <= 10
對於 20% n <= 15, T <= 10
對於 60% n <= 2000, T <= 10
對於其中 20% 2000 < n <= 10^7, T <= 3
對於其中 20% 10^7 < n <= 3*10^7, T = 1
題目

tag:數學

思路:裸的卡特蘭數(可是我不會寫啊,只能打表)。公式是C(2n,n)/(n-1)。註意要用逆元哦。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring> 
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int mod=1e9+7;
 8 int T,n; 
 9 int ksm(int x,int y)
10 {
11     int ret=1,b=y; 
12     while(b)
13     {
14         if(b&1) ret=1ll*ret*x%mod; 
15         x=1ll*x*x%mod;
16         b>>=1;
17     }
18     return ret; 
19 } 
20 int solve()
21 {
22     int ret1=1,ret2=1;
23     for(int i=2;i<=n;++i){
24         ret1=1ll*ret1*(n+i)%mod;
25         ret2=1ll*ret2*i%mod;
26     }
27     return 1ll*ret1*ksm(ret2,mod-2)%mod;
28 }
29 int main()
30 {
31     //freopen("football.in","r",stdin);
32     //freopen("football.out","w",stdout); 
33     scanf("%d",&T); 
34     while(T--){
35         scanf("%d",&n);
36         printf("%d\n",solve()); 
37     }
38     return 0; 
39 }

3、靶形數獨

單獨拿出來寫題解了,-->鏈接<--

芒果君:分割線懶得畫=_= 最近好頹,真的很想改變現狀,我不想做一個只會打表的OIer 要好好學習QAQ

沖刺Noip2017模擬賽8 解題報告——五十嵐芒果醬