CSP-J1027校內測試總結
CSP-J1027校內測試總結(2017NOIP真題)(315)
蒟蒻繼續更博
題目描述(100)
牛牛最近學習了C++入門課程,這門課程的總成績計算方法是:
總成績=作業成績×20%+小測成績×30%+期末考試成績×50%
牛牛想知道,這門課程自己最終能得到多少分。
輸入格式
三個非負整數A,B,C,分別表示牛牛的作業成績、小測成績和期末考試成績。相鄰兩個數之間用一個空格隔開,三項成績滿分都是100分。
輸出格式
一個整數,即牛牛這門課程的總成績,滿分也是100分。
分析
就是一道紅題,簡單的模擬一下(因為資料說是每一門成績都是十的倍數,就直接用int)
1 #include<bits/stdc++.h> 2using namespace std; 3 int main(){ 4 // freopen("score.in","r",stdin); 5 // freopen("score.out","w",stdout); 6 int a,b,c,ans; 7 cin>>a>>b>>c; 8 ans=a*0.2+b*0.3+c*0.5; 9 cout<<ans; 10 return 0; 11 }
題目描述(100)
圖書館中每本書都有一個圖書編碼,可以用於快速檢索圖書,這個圖書編碼是一個正整數。每位借書的讀者手中有一個需求碼,這個需求碼也是一個正整數。如果一本書的圖書編碼恰好以讀者的需求碼結尾,那麼這本書就是這位讀者所需要的。小D剛剛當上圖書館的管理員,她知道圖書館裡所有書的圖書編碼,她請你幫她寫 一個程式,對於每一位讀者,求出他所需要的書中圖書編碼最小的那本書,如果沒有他需要的書,請輸出−1。
輸入格式
第一行,包含兩個正整數n , q,以一個空格分開,分別代表圖書館裡書的數量和讀者的數量。
接下來的n行,每行包含一個正整數,代表圖書館裡某本書的圖書編碼。
接下來的q行,每行包含兩個正整數,以一個空格分開,第一個正整數代表圖書館裡讀者的需求碼的長度,第二個正整數代表讀者的需求碼。
輸出格式
q行,每行包含一個整數,如果存在第i個讀者所需要的書,則在第i行輸出第i個讀者所需要的書中圖書編碼最小的那本書的圖書編碼,否則輸出−1。
分析
就直接模擬,時間複雜度是O(n2),直接暴力就是了
1 #include<bits/stdc++.h> 2 using namespacestd; 3 int n,q,a[1009]; 4 int main(){ 5 // freopen("librarian.in","r",stdin); 6 // freopen("librarian.out","w",stdout); 7 cin>>n>>q; 8 for(int i=1;i<=n;i++){ 9 cin>>a[i]; 10 } 11 for(int i=1;i<=q;i++){ 12 int len,w,minn=100000001,f=0; 13 cin>>len>>w; 14 int m=pow(10,len); 15 for(int j=1;j<=n;j++){ 16 if(a[j]%m==w){ 17 minn=min(minn,a[j]); 18 f=1; 19 } 20 } 21 if(f==1) cout<<minn<<endl; 22 else cout<<-1<<endl; 23 } 24 return 0; 25 }
分析(15)
記憶化搜尋,由於自己智障,剪枝剪拐了,就很無語。。。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int INF=0x7fffffff; 4 int chx[4]={-1,0,1,0},chy[4]={0,-1,0,1}; 5 int f[110][110]; 6 int cc[110][110]; 7 int m,n,ans=INF; 8 void dfs(int x,int y,int sum,bool z){ 9 if(x<1||x>m||y<1||y>m) return; 10 if(sum>=f[x][y]) return; 11 f[x][y]=sum; 12 if(x==m&&y==m){ 13 if(sum<ans) ans=sum; 14 return; 15 } 16 for(int i=0;i<4;++i){ 17 int cx=x+chx[i]; 18 int cy=y+chy[i]; 19 if(cc[cx][cy]){ 20 if(cc[cx][cy]==cc[x][y])dfs(cx,cy,sum,0); 21 else dfs(cx,cy,sum+1,0); 22 } else 23 if(!z){ 24 cc[cx][cy]=cc[x][y]; 25 dfs(cx,cy,sum+2,1); 26 cc[cx][cy]=0; 27 } 28 } 29 } 30 int main(){ 31 memset(f,0x7f,sizeof(f)); 32 cin>>m>>n; 33 for(int i=1;i<=n;i++){ 34 int x,y,z; 35 cin>>x>>y>>z; 36 cc[x][y]=z+1; 37 } 38 dfs(1,1,0,0); 39 if(ans==INF) cout<<-1; 40 else cout<<ans; 41 return 0; 42 }
分析(100)
這道題之前做過,就在上週,於是我花了一個週末弄懂它,(主要是那個單調佇列DP優化,直接手寫兩遍程式碼,現在忘不了了),感謝一位巨巨的講解,思路清楚呢
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int SIZE=500010; 4 const long long INF=-0x3f3f3f3f; 5 long long sum_maxn=0; 6 struct node{ 7 int d,w; 8 }a[SIZE]; 9 int lc,rc,n,d,k,ans=-1; 10 long long f[SIZE],q[SIZE]; 11 long long solve(int left,int right){ 12 memset(f,-0x3f3f3f3f,sizeof(f)); 13 memset(q,0,sizeof(q)); 14 f[0]=0; 15 long long an=INF; 16 int head=1,tail=0,j=0; 17 for(int i=1;i<=n;i++){//單調佇列 18 while(a[i].d-a[j].d>=left&&j<i) { 19 if(f[j]>INF){ 20 while(head<=tail&&f[q[tail]]<=f[j]) tail--; 21 q[++tail]=j; 22 } 23 j++; 24 } 25 while(head<=tail&&a[i].d-a[q[head]].d>right) head++; 26 if(head<=tail)f[i]=f[q[head]]+a[i].w; 27 } 28 for(int i=1;i<=n;i++) an=max(f[i],an); 29 return an; 30 } 31 32 int main(){ 33 cin>>n>>d>>k; 34 for(int i=1;i<=n;i++){//輸入 35 cin>>a[i].d>>a[i].w; 36 if(a[i].w>0){ 37 sum_maxn+=a[i].w; 38 rc=max(rc,a[i].d); 39 } 40 } 41 if(sum_maxn<k){//特判,金幣數永遠都不會為k的情況 42 cout<<"-1"; 43 return 0; 44 } 45 while(lc<=rc){ 46 int mid=(lc+rc)>>1; 47 int l=max(1,d-mid),r=d+mid; 48 long long val=solve(l,r); 49 if(val<k) lc=mid+1; 50 else{ 51 ans=mid; 52 rc=mid-1; 53 } 54 } 55 cout<<ans; 56 return 0; 57 }
今天心情一般,跑了800m,差2s滿分,直接自閉,上課還要上到10點。。。hai