1. 程式人生 > 實用技巧 >CSP-J1027校內測試總結

CSP-J1027校內測試總結

CSP-J1027校內測試總結(2017NOIP真題)(315)

蒟蒻繼續更博

第一題成績

題目描述(100)

牛牛最近學習了C++入門課程,這門課程的總成績計算方法是:

總成績=作業成績×20%+小測成績×30%+期末考試成績×50%

牛牛想知道,這門課程自己最終能得到多少分。

輸入格式

三個非負整數A,B,C,分別表示牛牛的作業成績、小測成績和期末考試成績。相鄰兩個數之間用一個空格隔開,三項成績滿分都是100分。

輸出格式

一個整數,即牛牛這門課程的總成績,滿分也是100分。

分析

就是一道紅題,簡單的模擬一下(因為資料說是每一門成績都是十的倍數,就直接用int)

 1 #include<bits/stdc++.h>
 2
using 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 namespace
std; 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