日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

“九韶杯”河科院程序设计协会第一届程序设计竞赛 【前六题解析】

發布時間:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “九韶杯”河科院程序设计协会第一届程序设计竞赛 【前六题解析】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://ac.nowcoder.com/acm/contest/13493#rank

目錄

  • A: 6的個數
  • B: 小明的作業
  • C: 斐波那契
  • D: 數列重組
  • E: 三角形個數
  • F: 字符串

A: 6的個數


https://ac.nowcoder.com/acm/contest/13493/A
簽到題

#include<cstdio> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<algorithm> #include<map> #include<vector> #include<queue> #include<set> int sum=0; using namespace std; int main(void) {for(int i=0;i<=2021;i++){int temp=i;while(temp){int t=temp%10;if(t==6) sum++;temp/=10;}}cout<<sum<<endl;return 0; }

B: 小明的作業


https://ac.nowcoder.com/acm/contest/13493/B
唉,數的時候加錯了,算成了68 25
正確答案是 78 和 25。
大致思路就是: 將wa轉換成一個特殊的符號。aw也轉換成一個特殊的符號 ;例如 &&
將其他的字符弄成空格。看輸出的挨個數,&&是警告 長的例如&&&&就是錯誤的。

#include<cstdio> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<algorithm> #include<map> #include<vector> #include<queue> #include<set> using namespace std; string a; int sum1,sum2; int main(void) {/*cin>>a;cout<<endl<<endl;for(int i=0;i+1<a.size();i++){if(a[i]=='w'&&a[i+1]=='a'){a[i]='*';a[i+1]='*';i++;continue;}if(a[i]=='a'&&a[i+1]=='w'){a[i]='&';a[i+1]='&';i++;continue;}a[i]=' ';}cout<<a<<endl;*/cout<<78<<endl;cout<<25<<endl; return 0; }


文件操作:
我上面的那種畢竟需要手數。不是純編程的,那么我想了一下純編程的。
才發現好麻煩。

文件操作有一個大坑,記住不要用筆記本的替換字符功能,太坑了。



大致思路就是,還是上面的處理操作。不過把輸出的內容輸出到一個文本。
我們從文本里讀取處理后的字符串,統計個數。

處理字符的時候注意: wa 和 aw的變換字符要不相同。不然會問題。

: wawaaw 要處理為 &&&&** 要統一處理的話就是 &&&&&& 統計的結果明顯是不同的 #include<cstdio> #include<iostream> #include<sstream> #include<cstring> using namespace std; string a; int sum1; int sum2; int main(void) {/*cin>>a;//處理字符串for(int i=0;i+1<a.size();i++){if(a[i]=='w'&&a[i+1]=='a'){a[i]='*';a[i+1]='*';i++;continue;}if(a[i]=='a'&&a[i+1]=='w'){a[i]='&';a[i+1]='&';i++;continue;}a[i]=' ';}freopen("1.txt","w",stdout);//將處理好的字符串輸出到我們的文件中 1.txtcout<<a<<endl;*/freopen("1.txt","r",stdin);//從文件中讀取 統計個數getline(cin,a);int count1=0;//看讀取了幾個字符int count2=0;//卡讀取了幾個字符bool flag1=false;//判斷讀取到了bool flag2=false;//判斷讀取到了特殊字符for(int i=0;i<a.size();i++){if(a[i]=='&')//讀取到了特殊字符{count1++;//計數加一flag1=true;//判斷開始continue;}if(flag1&&a[i]!='&')//說明是&開頭的字符,且這一串的&已經讀取完了{if(count1>2) sum2++;//說明是一個連著的字符else sum1++;//說明是單個的字符count1=0;flag1=false;}if(a[i]=='*'){count2++;flag2=true;continue;}if(flag2&&a[i]!='*'){if(count2>2) sum2++;else sum1++;count2=0;flag2=false;}}cout<<sum1<<endl;cout<<sum2<<endl;return 0; }


還是第一種香,方便。第二種容易出錯。

C: 斐波那契


https://ac.nowcoder.com/acm/contest/13493/C
關鍵點: 在計算的時候要記得求分子和分母的最大共約數約分,不要會爆long long
我計算的時候是先打表 斐波那契前20項
再打表分母前13項。一邊看一下有沒有出錯。
一邊看一下,會不會爆long long 。
大致看了一下,一定會爆的。那么我們在每次兩數相加的時候,通分一下就好了(即分子和分母同時除以兩者的最大共約數)。

#include<cstdio> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<algorithm> #include<map> #include<vector> #include<queue> #include<set> using namespace std; int a[20]={0,1,1}; int b[20]; long long int s1; long long int s2; long long int gcd(long long int a,long long int b) {if(b==0) return a;return gcd(b,a%b); } int main(void) {for(int i=3;i<=18;i++)//斐波那契數列 {a[i]=a[i-1]+a[i-2];}for(int i=1;i<=13;i++){b[i]=a[i]*a[i+1];//分母 }s1=1;//分子 s2=1;//分母 for(int i=2;i<=13;i++){s1=s1*b[i]+1*s2;s2=s2*b[i];long long int temp=gcd(s1,s2);//兩者的最大共約數 s1=s1/temp;//通分 s2=s2/temp;//通分 } cout<<s1<<"/"<<s2<<endl;//cout<<6535086616739<<"/"<<3684083162760<<endl;return 0; }

D: 數列重組


https://ac.nowcoder.com/acm/contest/13493/D
注意: 題目問的是有幾種排列的方式。是全列列中,看有沒有滿足條件的。
我最開始以為是全排列后,再分不同的堆,不同的分法是不同種。好吧眼瞎了沒有看提示。
本題用is_sort()函數及其的方便。感興趣的可以搜一搜具體的用法。

#include<cstdio> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<algorithm> #include<map> #include<vector> #include<queue> #include<set> using namespace std; int a[10]={2,5,3,6,3,6,7,3,7,8}; int ans; int sum=0; bool cmp(int a,int b) {return a>b; } int main(void) {sort(a,a+10);bool flag;do{flag=false;for(int i=0;i<8;i++){ for(int j=i+1;j<9;j++){if( ( is_sorted(a,a+i+1) || is_sorted(a,a+i+1,cmp) )&& ( is_sorted(a+i+1,a+j+1)||is_sorted(a+i+1,a+j+1,cmp) )&& ( is_sorted(a+j+1,a+10)||is_sorted(a+j+1,a+10,cmp) ) ) {flag=true;break;}}if(flag)break;}if(flag)ans++;}while(next_permutation(a,a+10));cout<<ans<<endl;return 0; }

E: 三角形個數


https://ac.nowcoder.com/acm/contest/13493/E
數學問題,找規律,推出公式。

官方題解是這樣的:

套公式看一下規律:

其實這個道題的大致思路:
就是看 從1~n邊長的所有的 正著的三角形的個數和倒著的三角形的個數之和。
說實話,這規律我覺得不容易推,何況考試的時候緊張和慌不好找,建議記住大致的公式模板。

#include<iostream> #include<cstdio> #define ll long long using namespace std; ll ans=0; ll m=1e9+7; int main(void) { ll n=20210411;for(int i=1;i<=n;i++){ll a=(n-i+2)*(n-i+1)/2%m;//正三角型個數 if((n-2*i+1)>0) a=(a+(n-2*i+1)*(n-2*i+2)/2)%m;//倒著的三角形個數 ans=(ans+a)%m;}cout<<ans<<endl;return 0; }

F: 字符串


https://ac.nowcoder.com/acm/contest/13493/F
挺簡單的,不過考完后看了一下自己AC的代碼,感覺寫的真的垃圾。

#include<cstdio> #include<cmath> #include<cstring> #include<string> #include<iostream> #include<algorithm> #include<map> #include<vector> #include<queue> #include<set> using namespace std; int n; string a[10005]; string str; string cmp="@wyk"; int ans; int main(void) {scanf("%d",&n);getline(cin,str);for(int i=0;i<n;i++){getline(cin,a[i]);}for(int i=0;i<n;i++){for(int j=0;j<a[i].size();j++){bool flag=false;if(a[i][j]=='@'){int k=j+1;int w;for(w=1;w<=3;w++){if(a[i][k++]!=cmp[w])break;}if(w==4){flag=true;}}if(flag){ans++;break;}}}cout<<ans;return 0; }

復盤的時候,一想 直接用string的find()函數它不爽么?

#include<cstring> #include<string> #include<cstdio> #include<iostream> using namespace std; const int N=10010; int n; int ans; string str[N]; string s="@wyk"; int main(void) {cin>>n;char a=getchar();for(int i=0;i<n;i++) getline(cin,str[i]);for(int i=0;i<n;i++){if(str[i].find(s)!=string::npos)ans++; }cout<<ans<<endl;return 0; }

其實可以一邊輸入,一邊統計

#include<cstring> #include<string> #include<cstdio> #include<iostream> using namespace std; int n; int ans; string str; string s="@wyk"; int main(void) {cin>>n;char a=getchar();for(int i=0;i<n;i++) {getline(cin,str);if(str.find(s)!=string::npos)ans++; } cout<<ans<<endl;return 0; }

官方題解也不錯

#include <iostream> #include <vector> #include <algorithm>using namespace std;int main(){int ans=0,n;cin>>n;getchar();for(int i=0;i<n;i++){string s;getline(cin,s);for(int j=0;j<s.size();j++){if(s[j]=='@'){if(s.substr(j,4)=="@wyk"){ans++;break;}}}}cout<<ans<<endl;return 0; }

總結

以上是生活随笔為你收集整理的“九韶杯”河科院程序设计协会第一届程序设计竞赛 【前六题解析】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。