return 0;
}
P8665 [藍橋杯 2018 省 A] 航班時間
題目
前置知識
去程時間 =飛行時間 + 時差;回程時間 = 飛行時間 ? 時差由此可知 飛行時間 = (去+回)/ 2
用 scanf 輸入前面的時間:
scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
每一行后面不一定有額外的天數(shù)。如果有,則中間一定有空格,所以判斷下一個字符是否為空格即可。為方便計算,不妨把時間都轉換成以秒為單位 t=86400?d+3600?h+60?m+sh = ans/3600 min = ans%3600/60 s = ans%60
#include
#define endl '\n'
#define INF 0x3f3f3f3f3f
const int N = 1000010;
using namespace std;
int get()
{
int h1,m1,s1,h2,m2,s2,day=0;
scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
if(getchar()==' ')scanf("(+%d)",&day);
return (day*86400+h2*3600+m2*60+s2)-(h1*3600+m1*60+s1);
}
signed main()
{
int T;
scanf("%d",&T);
while(T--)
{
int ans=(get()+get())/2;
printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60);
}
return 0;
}
P8681 [藍橋杯 2019 省 AB] 完全二叉樹的權值
題目
思路 模擬完全二叉樹的性質
設深度為 dep,根節(jié)點的深度為 1。則有第 dep 層的節(jié)點為 2dep,每層開頭的節(jié)點編號為 2dep?1,末尾的節(jié)點編號為 2dep?1(以上結論葉子節(jié)點除外)。
注意上面加粗黑體字 第一次沒考慮到 錯了兩個點 葉子節(jié)點需要額外特判
#include
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N];
int n;
int dep = 1,sum = 0,Max = -1,a,ans;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i = 1; i <= n; i++){
cin>>a;
sum+=a;
if(i == (1<if(sum>Max){
Max = sum;
ans = dep;
}
dep++;
sum = 0;
}
}
if(sum>Max){//葉子節(jié)點特判
Max = sum;
ans = dep;
}
cout<return 0;
}
P9231 [藍橋杯 2023 省 A] 平方差
題目
思路 找規(guī)律參考題解
#include
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N];
int n;
int f(int x) {//小于等于x的奇數(shù)個數(shù)
if (!x) return 0;
return (x + 1) / 2;
}
int g(int x) {//小于等于x的4的倍數(shù)個數(shù)
return x / 4;
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int l, r; cin >> l >> r;
cout << f(r) - f(l - 1) + g(r) - g(l - 1);
return 0;
}
P9230 [藍橋杯 2023 省 A] 填空問題
題目
思路problem A 填空題 本地暴力枚舉 把數(shù)字轉成字符串去處理答案為 4430091
#include
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e8;
bool check(string s){
int ans1 = 0 ,ans2 = 0;
for(int i = 0; i < s.size();i++){
if(ians1 += s[i]-'0';
else
ans2 += s[i]-'0';
}
return ans1 == ans2;
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string s;
int ans = 0;
for(int i = 1 ; i<= N;i++){
s= to_string(i);
if(s.size()%2 == 1)continue;//奇數(shù)
if(check(s)) {
ans++;
}
}
cout<return 0;
}
problem B DFS 本地暴搜答案為 4165637
#include
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1e8;
int arr[N];
int ans;
void dfs(int score,int cnt){
if(cnt>30||score == 100)
return;
if(cnt == 30 && score == 70)
ans++;
dfs(score+10,cnt+1);
dfs(0,cnt+1);
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//表示0分 0題
dfs(0,0);
cout<return 0;
}
P8649 [藍橋杯 2017 省 B] k 倍區(qū)間
題目
題解參考
思路 看到”連續(xù)子序列求和”這一要求時,我們果斷選擇前綴和解答
#include
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N],sum[N];
int n,k;
map mp;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
int ans = 0;
mp[0] = 1;
for(int i = 1; i<=n;i++){
cin>>arr[i];
sum[i] = (sum[i-1]+ arr[i])%k;//記錄前綴和模k的值
mp[sum[i]]++;
}
for(int i = 0; i< n;i++){
ans+=(mp[i]*(mp[i]-1))/2;
}
cout<return 0;
}
自己的理解 解釋:1要和其他1組一起 滿足
????????????????0可以單獨算也可以組在一起 滿足
#include
#define int long long
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100010;
int arr[N],sum[N];
int n,k;
map mp;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
int ans = 0;
for(int i = 1; i<=n;i++){
cin>>arr[i];
sum[i] = (sum[i-1]+ arr[i])%k;//記錄前綴和模k的值
mp[sum[i]]++;
}
for(auto i :mp){
if(i.first == 0)
ans+=i.second*(i.second+1)/2;
else
ans+=i.second*(i.second-1)/2;
}
cout<return 0;
}
P8623 [藍橋杯 2015 省 B] 移動距離
題目
思路 純模擬重點在于算出兩個建筑物的坐標,及需要算出兩個建筑物分別的 x 和 y 坐標。根據(jù)樣例 不難看出 奇數(shù)行和偶數(shù)行的情況分別相同為了方便,我們把 1 2 3 4 5 6 這一行稱作第 0 行,預處理 將編號全部減一 少做一個特判 爽 即(1 2 3 4 5 6 )->(0 1 2 3 4 5)這樣一來,顯然可以得出對于奇數(shù)行第 k 個點的坐標是:
而偶數(shù)行為(把奇數(shù)行的橫坐標倒換):
#include
#define int long long
#define INF 0x3f3f3f3f
#define end '\n'
const int N = 10010;
using namespace std;
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int w,m,n;
cin>>w>>m>>n;
m--;//預處理
n--;
int x1 = m%w, y1 = m/w,x2 = n%w,y2 = n/w;
if(y1%2 == 1){//判斷奇偶層數(shù)
x1 = w-1-x1;
}
if(y2%2 == 1){
x2 = w-1-x2;
}
cout<return 0;
}
P8682 [藍橋杯 2019 省 B] 等差數(shù)列
題目
思路 求公差這就意味著我們已經(jīng)知道了最終等差數(shù)列的首項和末項,所以我們只需求出公差即可。為了使項數(shù)最少,我們需要公差盡可能地大。所以任意兩項的差均為公差 d 的倍數(shù),于是所求 d 為所有相鄰兩項差的公約數(shù)。又因為 d 要最大,所以 d 就是所有相鄰兩項差的最大公約數(shù)。
#include
#define int long long
#define INF 0x3f3f3f3f
#define end '\n'
const int N = 100010;
using namespace std;
int arr[N];
int gcd(int x,int y){
if(y == 0)
return x;
return gcd(y, x % y);
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i = 1; i <= n ;i++){
cin>>arr[i];
}
sort(arr+1,arr+n+1);//排序
if(arr[1]==arr[n]){//加特判 d為0
cout<return 0;
}
int d = arr[2]-arr[1];
for(int i = 2 ; i <= n;i++){
d = gcd(d,arr[i]-arr[i-1]);
}
cout<<(arr[n]-arr[1])/d+1<return 0;
}
柚子快報激活碼778899分享:藍橋杯刷題計劃-洛谷-持續(xù)更新
http://yzkb.51969.com/
參考鏈接