我的做题日志(1),来源:COCI2017,SDOJ
Mirko在一家大型IT公司暑假實(shí)習(xí)。 該公司構(gòu)建了一個(gè)由N行和M列組成的大型數(shù)據(jù)庫(kù)。
在他第一天,Mirko收到了Q個(gè)查詢。 每個(gè)查詢由M個(gè)數(shù)字組成。
然而,一些數(shù)字在傳輸過(guò)程中丟失,所以它們用-1表示。 Mirko想知道數(shù)據(jù)庫(kù)中有多少行對(duì)應(yīng)于查詢,即數(shù)據(jù)庫(kù)的行數(shù)與查詢相同,不包括-1。
例如,如果查詢是-1 3 2的形式,那么我們需要統(tǒng)計(jì)滿足,第一列是任何數(shù)字,第二列中的數(shù)字為3 ,第3列中的數(shù)字2。
由于他剛開始實(shí)習(xí),Mirko需要你的幫助。 幫助他并回答查詢!
輸入
第一行輸入包含數(shù)據(jù)庫(kù)的大小N(1≤N≤1e3)和M(1≤M≤1e3)。
以下N行中的每一行包含M數(shù)字A ij(1≤Aij≤10^6),數(shù)據(jù)庫(kù)的內(nèi)容。
以下行包含Q(1≤Q≤50),查詢次數(shù)。
以下Q行中的每一行包含M個(gè)數(shù)字Bij(Bij = -1 或1≤Bij≤10^6),表示第i個(gè)查詢的描述。
輸出
輸出必須包含Q行,每行包含X,表示第i個(gè)查詢的答案。
樣例略
題解:
初次寫題解,不喜勿噴。本題就是一道帶有一定思維難度的模擬,因?yàn)閿?shù)據(jù)較小,所以普及提高還可以出,(Q<=1000時(shí),用分塊FFT搞定,這個(gè)至少 省選(也可能是國(guó)賽才有,畢竟還沒考過(guò)))。直接按照題意寫會(huì)TLE,所以需要注意一些細(xì)節(jié)。
首先是在每個(gè)查詢的位置,這是本題主要卡時(shí)間的地方,至少我在SDOJ上被卡掉了20分(類樂多賽制),我們?cè)谶@里只需要一個(gè)二層循環(huán)實(shí)現(xiàn),但很容易寫出一個(gè)來(lái)標(biāo)記,一個(gè)來(lái)查找這種思維簡(jiǎn)單但十分費(fèi)事的算法。所以應(yīng)該按照題目給出的每組數(shù)據(jù),從前到后掃描,匹配每個(gè)位置,遇到-1就continue,同時(shí)用一個(gè)變量來(lái)記錄方案數(shù),我用的是ans。這個(gè)ans有個(gè)很巧妙的設(shè)計(jì),就是在開始時(shí),將ans初始化為N,就是行數(shù)(因?yàn)槭遣樵兪窃儐栍卸嗌傩?#xff09;,然后一旦失配,就break,并將ans--。
題解說(shuō)完了,上代碼:
#include<bits/stdc++.h> using namespace std; const int N=1005; int n,m,a[N][N],b[N]; int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);int Q;scanf("%d",&Q);while(Q--){for(int i=1;i<=m;i++)scanf("%d",&b[i]);int ans=n;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(b[j]==-1)continue;else{if(a[i][j]==b[j])continue;else{ans--;break;}}}}cout<<ans<<endl;}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/Neonen/p/9832504.html
總結(jié)
以上是生活随笔為你收集整理的我的做题日志(1),来源:COCI2017,SDOJ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 养殖用地如何申请备案?
- 下一篇: Kali 2017更新源