生活随笔
收集整理的這篇文章主要介紹了
520 钻石争霸赛 题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說好的鉆石難度,結果本人菜的一地。。只有88分。。。。
文章目錄 7-1 考試周 7-2 真的恭喜你 7-3 平均成績 7-4 古風A+B 難度開始上升 7-5 猜近似數字 7-6 隨機輸一次 7-7 階乘的非零尾數 7-8 三足鼎立
前四題
十分鐘AC
后兩題二十分鐘自閉
第五題玄學卡點不知為何
7-1 考試周
模擬即可,按照格式要求輸出
#include <bits/stdc++.h>
using namespace std
;
int main ( )
{ double a
, b
, c
; cin
>> a
>> b
; c
= a
/ b
; printf ( "%.0lf/%.1f=%.0f" , a
, c
, b
) ;
}
7-2 真的恭喜你
if比較輸出
#include <bits/stdc++.h>
using namespace std
;
int main ( )
{ int n
; cin
>> n
; if ( n
>= 90 ) printf ( "gong xi ni kao le %d fen!" , n
) ; else printf ( "kao le %d fen bie xie qi!" , n
) ;
}
7-3 平均成績
1和0分別代表男女 男女成績分別存,各自算出平均值,然后再求總平均值
#include <bits/stdc++.h>
using namespace std
; double sum1
; double sum2
; double ans1
; double ans2
;
int main ( )
{ double n
; double a
, b
; cin
>> n
; for ( int i
= 1 ; i
<= n
; i
++ ) { cin
>> a
>> b
; if ( a
== 1 ) { sum1
++ ; ans1
+ = b
; } else { sum2
++ ; ans2
+ = b
; } } if ( sum1
== 0 ) { printf ( "%.1lf X %.1lf" , ( ans1
+ ans2
) / n
, ans2
/ sum2
) ; } else if ( sum2
== 0 ) { printf ( "%.1lf %.1lf X" , ( ans1
+ ans2
) / n
, ans1
/ sum1
) ; } else { printf ( "%.1lf %.1lf %.1lf" , ( ans1
+ ans2
) / n
, ans1
/ sum1
, ans2
/ sum2
) ; }
}
7-4 古風A+B
特判正負,因為“-”符號要特別一行,然后拆成單個存入數組,再從數組輸出
#include <bits/stdc++.h>
using namespace std
; double sum1
; double sum2
; double ans1
; double ans2
;
int w
[ 100 ] ;
int main ( )
{ long long a
, b
, c
; cin
>> a
>> b
; c
= a
+ b
; int ans
= 0 ; if ( c
< 0 ) { cout
<< "-" << endl
; c
= c
* - 1 ; } if ( c
== 0 ) { cout
<< "0" ; return 0 ; } while ( c
) { w
[ ++ ans
] = c
% 10 ; c
/ = 10 ; } for ( int i
= ans
; i
>= 1 ; i
-- ) { cout
<< w
[ i
] << endl
; }
}
難度開始上升
7-5 猜近似數字
注意兩個數如果長度不一樣直接就算錯,輸出“No”, 相同情況下,從最高位開始求差的絕對值,如果該位差的絕對值大于1,就算錯,則輸出“No” 如果有一位差的絕對值是1,則后面再出現絕對值1的情況,也算輸, 也就是所有位上最多只能有一位的差絕對值是1,數量不能多,差的決定值不能大于1 但是這個題我錯了一個點也不知道為什么?可能哪里我忽視了 我的代碼如下(包含錯誤)
#include <bits/stdc++.h>
using namespace std
;
double b
= 0 , g
= 0 ;
double sum
;
int sumb
, sumg
;
int main ( )
{ string a
, b
; int c
[ 1004 ] ; cin
>> a
; char ch
= getchar ( ) ; while ( cin
>> b
&& b
!= "-1" ) { memset ( c
, 0 , sizeof ( c
) ) ; ch
= getchar ( ) ; if ( a
. length ( ) != b
. length ( ) ) cout
<< "No" << endl
; else { for ( int i
= 0 ; i
< a
. length ( ) ; i
++ ) { if ( a
[ i
] < b
[ i
] ) c
[ i
] = b
[ i
] - a
[ i
] ; else c
[ i
] = a
[ i
] - b
[ i
] ; } bool f
= 0 ; for ( int i
= 0 ; i
<= a
. length ( ) ; i
++ ) { if ( c
[ i
] > 1 ) { cout
<< "No" << endl
; f
= 0 ; break ; } else if ( c
[ i
] == 1 && f
== 0 ) { f
= 1 ; } else if ( c
[ i
] == 1 && f
== 1 ) { cout
<< "No" << endl
; f
= 0 ; break ; } } if ( f
== 1 ) cout
<< "Yes" << endl
; } } }
正確代碼:(學校的大佬)
#include <bits/stdc++.h> using namespace std
; string a
, b
; int n
; bool boolean ( ) { int l
= a
. size ( ) ; bool f
= 0 ; for ( int i
= 0 ; i
< l
; i
++ ) { if ( abs ( a
[ i
] - b
[ i
] ) == 0 ) { continue ; }
else if ( abs ( a
[ i
] - b
[ i
] ) == 1 && f
== 0 ) { f
= 1 ; } else return 0 ; } return 1 ; } int main ( ) { cin
>> a
; while ( 1 ) { cin
>> b
; if ( b
== "-1" ) break ; if ( b
. size ( ) != a
. size ( ) ) { printf ( "No\n" ) ; continue ; } if ( boolean ( ) ) printf ( "Yes\n" ) ; else printf ( "No\n" ) ; } return 0 ; }
7-6 隨機輸一次
尖子石頭步的拼音第一位都不一樣,所以光比第一位就可以 注意k中是每個多少局輸一次,而非是第多少局輸一次
* * #include
< bits
/ stdc
++ . h
>
using namespace std
;
int k
[ 10006 ] ;
int main ( )
{ int n
; cin
>> n
; for ( int i
= 1 ; i
<= n
; i
++ ) cin
>> k
[ i
] ; char ch
; ch
= getchar ( ) ; char s
[ 13 ] ; int ans
= 1 ; int sum
= 0 ; bool f
= 0 ; while ( ~ scanf ( "%s" , s
) ) { sum
++ ; if ( ans
> n
) ans
% = n
; if ( k
[ ans
] + 1 == sum
) { f
= 1 ; ans
++ ; sum
= 0 ; } else f
= 0 ; if ( s
[ 0 ] == 'E' ) break ; if ( s
[ 0 ] == 'C' ) { if ( f
== 1 ) cout
<< "JianDao" << endl
; else cout
<< "Bu" << endl
; } else if ( s
[ 0 ] == 'J' ) { if ( f
== 1 ) cout
<< "Bu" << endl
; else cout
<< "ChuiZi" << endl
; } else if ( s
[ 0 ] == 'B' ) { if ( f
== 1 ) cout
<< "ChuiZi" << endl
; else cout
<< "JianDao" << endl
; } ch
= getchar ( ) ; } return 0 ;
} * *
以下兩題代碼均來自我學校的大佬學長
7-7 階乘的非零尾數
之前見過一個求最后一個非零尾數 數論問題,首先考慮末尾產生0的情況,只有當相乘的數的因子中出現2和5時會出現0,也就是0的數量取決于出現多少對2和5。 2和5都有時就出現一個0,所以求min(5,2) 因為在階乘中5的數量是少于2的,所以只需要討論因子中有多少個5就行,對于求后k位非零數,因為對于一個整數的后k位很簡單,都會求,所以只需要在計算階乘的過程中將對應數量的 2和5除去即可 比如求5!=12345=120的后兩位非零數,就是在計算時將2和5去除計算341,然后mod 100即可
#include <bits/stdc++.h> using namespace std
;
typedef long long ll
;
int num1
, num2
;
int n
, k
;
int main ( ) { cin
>> n
>> k
; int n1
= n
; while ( n1
) { num1
+ = n1
/ 5 ; n1
= n1
/ 5 ; } int num
= num1
; num2
= num1
; ll mod
= pow ( 10 , k
) ; ll sum
= 1 ; for ( int i
= 1 ; i
<= n
; i
++ ) { int w
= i
; while ( w
% 2 == 0 && num1
) { w
/ = 2 ; num1
-- ; } while ( w
% 5 == 0 && num2
) { w
/ = 5 ; num2
-- ; } sum
= ( sum
% mod
* w
% mod
) % mod
; } string c
= "%0" ; c
= c
+ ( char ) ( k
+ '0' ) + "lld" ; printf ( c
. data ( ) , sum
) ; printf ( " %d" , num
) ; return 0 ;
}
7-8 三足鼎立
之前做過一個類似的,是求能組成多少個三角形 暴力,肯定是不對滴,超時嘛 因為是構成三角形,也就是任何兩邊之差一定小于第三邊 其中一個邊已經給了
我們可以先排序,這樣具備單調性, 枚舉一個邊,然后通過二分來確定第三個邊的范圍,在這范圍內的是符合單個條件,然后反過來操作(確定第三個邊,然后二分第二個邊),重復部分就符合全部要求 所以最后結果除以二
#include <bits/stdc++.h> using namespace std
;
typedef long long ll
;
int num1
, num2
;
int n
, k
;
const int maxn
= 1e6 + 4 ;
int a
[ maxn
] ;
int main ( ) { int n
, p
; cin
>> n
>> p
; for ( int i
= 0 ; i
< n
; i
++ ) cin
>> a
[ i
] ; sort ( a
, a
+ n
) ; ll sum
= 0 ; for ( int i
= 0 ; i
< n
; i
++ ) { int high
= lower_bound ( a
, a
+ n
, a
[ i
] + p
) - a
; int low
= upper_bound ( a
, a
+ n
. abs ( a
[ i
] - p
) ) - a
; int num
= high
- low
; if ( i
>= low
&& i
<= high
) { num
-- ; sum
++ num
; } } cout
<< sum
/ 2 << endl
;
}
總結
以上是生活随笔 為你收集整理的520 钻石争霸赛 题解 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。