~衝刺noip~集訓第三天*noip2014真題
阿新 • • 發佈:2018-12-14
要衝刺2018年的noip了~為什麼我要從第三天開始寫,因為前兩天都在講初賽…………(沒啥關係……)
———————————本來不想說廢話的———————————
好的,我來分析一下得分率不怎麼高的(很多人只有30……)第!一!題!
1. 珠心算測驗
(count.cpp/c/pas) 【問題᧿述】 珠心算是一種通過在腦中模擬算盤變化來完成快速運算的一種計算技術。珠心算訓練, 既能夠開發智力,又能夠為日常生活帶來很多便利,因而在很多學校得到普及。 某學校的珠心算老師採用一種快速考察珠心算加法能力的測驗方法。他隨機生成一個正 整數集合,集合中的數各不相同,然後要求學生回答:其中有多少個數,恰好等於集合中另 外兩個(不同的)數之和? 最近老師出了一些測驗題,請你幫忙求出答案。 【輸入】 輸入檔名為 count.in。 輸入共兩行,第一行包含一個整數 n,表示測試題中給出的正整數個數。 第二行有 n 個正整數,每兩個正整數之間用一個空格隔開,表示測試題中給出的正整數。 【輸出】 輸出檔名為 count.out。 輸出共一行,包含一個整數,表示測驗題答案。 【輸入輸出樣例】 count.in
4 1 2 3 4
count.out 2 【樣例說明】 由 1+2=3, 1+3=4,故滿足測試要求的答案為 2。 注意,加數和被加數必須是集合中的 兩個不同的數。 【資料說明】 對於 100%的資料, 3 ≤ n ≤ 100,測驗題給出的正整數大小不超過 10,000。
這一題還是簡單的,sort一下,然後模擬一下
#include<bits/stdc++.h> using namespace std; int n,ans,i,j,l,a[104],f[104]; inline const int read() { int num=0,bj=1;char x=getchar(); while(x<'0'||x>'9'){if(x=='-')bj=-1;x=getchar();} while(x>='0'&&x<='9'){num=num*10+x-'0';x=getchar();} return num*bj; } inline void write(int x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); } int main() { freopen("count.in","r",stdin); freopen("count.out","w",stdout); for(scanf("%d",&n),i=1;i<=n;i++)a[i]=read(); sort(a+1,a+n+1); int ans=0; for(i=1;i<n-1;i++) for(j=i+1;j<n;j++) for(l=j+1;l<=n;l++) if(a[i]+a[j]==a[l])f[l]=1; for(i=1;i<=n;i++)ans+=f[i]; write(ans); return 0; }
2.比例簡化
( ratio.cpp/c/pas) 【問題᧿述】 在社交媒體上,經常會看到針對某一個觀點同意與否的民意調查以及結果。例如,對某 一觀點表示支援的有 1498 人,反對的有 902 人,那麼贊同與反對的比例可以簡單的記為 1498:902。 不過,如果把調查結果就以這種方式呈現出來,大多數人肯定不會滿意。因為這個比例 的數值太大,難以一眼看出它們的關係。對於上面這個例子,如果把比例記為 5:3,雖然與 真實結果有一定的誤差,但依然能夠較為準確地反映調查結果,同時也顯得比較直觀。 現給出支援人數 A,反對人數 B,以及一個上限 L,請你將 A 比 B 化簡為 A’比 B’,要 求在 A’和 B’均不大於 L 且 A’和 B’互質(兩個整數的最大公約數是 1)的前ᨀ下, A’/B’ ≥ A/B 且 A’/B’ - A/B 的值儘可能小。 【輸入】 輸入檔名為 ratio.in。 輸入共一行,包含三個整數 A, B, L,每兩個整數之間用一個空格隔開,分別表示支援 人數、反對人數以及上限。 【輸出】 輸出檔名為 ratio.out。 輸出共一行,包含兩個整數 A’, B’,中間用一個空格隔開,表示化簡後的比例。 【輸入輸出樣例】 ratio.in
1498 902 10
ratio.out 5 3 【資料說明】 對於 100%的資料, 1 ≤ A ≤ 1,000,000, 1 ≤ B ≤ 1,000,000, 1 ≤ L ≤ 100, A/B ≤ L。
#include<bits/stdc++.h>
inline const int read()
{
int num=0,bj=1;char x=getchar();
while(x<'0'||x>'9'){if(x=='-')bj=-1;x=getchar();}
while(x>='0'&&x<='9'){num=num*10+x-'0';x=getchar();}
return num*bj;
}
int gcd(int xx,int yy)
{
if(yy==0)return xx;
else return gcd(yy,xx%yy);
}
int a,b,l,ans_a,ans_b,i,j;
double x,y,z;
int main()
{
freopen("ratio.in","r",stdin);
freopen("ratio.out","w",stdout);
a=read(),b=read(),l=read();
x=a*1.0/b;y=l*1.0;
for(i=1;i<=l;i++)
for(j=1;j<=l;j++)
if(gcd(i,j)==1)
{
z=i*1.0/j;
if(z>=x&&z-x<y)
{
ans_a=i;ans_b=j;
y=z-x;
}
}
printf("%d %d",ans_a,ans_b);
fclose(stdin);
fclose(stdout);
return 0;
}
3. 螺旋矩陣 (matrix.cpp/c/pas) 【問題᧿述】 一個 n 行 n 列的螺旋矩陣可由如下方法生成: 從矩陣的左上角(第 1 行第 1 列)出發,初始時向右移動;如果前方是未曾經過的格子, 則繼續前進,否則右轉;重複上述操作直至經過矩陣中所有格子。根據經過順序,在格子中 依次填入 1, 2, 3, ... , n2,便構成了一個螺旋矩陣。 下圖是一個 n = 4 時的螺旋矩陣。 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 現給出矩陣大小 n 以及 i 和 j,請你求出該矩陣中第 i 行第 j 列的數是多少。 【輸入】 輸入檔名為 matrix.in。 輸入共一行,包含三個整數 n, i, j,每兩個整數之間用yo一個空格隔開,分別表示矩陣 大小、 待求的數所在的行號和列號。 【輸出】 輸出檔名為 matrix.out。 輸出共一行,包含一個整數,表示相應矩陣中第 i 行第 j 列的數。 【輸入輸出樣例】 matrix.in
4 2 3
matrix.outyo 14 【資料說明】 對於 50%的資料, 1 ≤ n ≤ 100; 對於 100%的資料, 1 ≤ n ≤ 30,000, 1 ≤ i ≤ n, 1 ≤ j ≤ n。
#include<bits/stdc++.h>
using namespace std;
inline const int read()
{
int num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9')
{
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9')
{
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
int bukeshao(int x,int y,int z,int buzhidaopushemobianliangminghaola)
{
int p;
if(x>y)p=y;else p=x;
if(p>z)p=z;
if(p>buzhidaopushemobianliangminghaola)p=buzhidaopushemobianliangminghaola;
return p;
}
int i,j,x,y,m,n,k,ans;
int main()
{
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
n=read(),x=read(),y=read();
if(n==1)
{
write(1);
return 0;
}
k=bukeshao(x,y,n-x+1,n-y+1);
if(k==1)
{
if(x==1)ans=y;
else if(y==n)ans=n-1+y;
else if(x==n)ans=(n-1)*2+(n-y+1);
else if(y==1)ans=(n-1)*3+(n-x+1);
printf("%d\n",ans);
return 0;
}
ans=0;m=n;
for(i=1;i<k;i++)
{
ans+=(m-1)*4;
m-=2;
}
if(k==x)ans+=y-k+1;
else if(k==n-y+1)
{
ans+=m-1;
ans+=x-k+1;
}
else if(k==n-x+1)
{
ans+=(m-1)*2;
ans+=(n-y+1)-k+1;
}
else if(k==y)
{
ans+=(m-1)*3;
ans+=(n-x+1)-k+1;
}
write(ans);
fclose(stdin);
fclose(stdout);
return 0;
}