【思特奇杯·云上蓝桥·算法集训营】第四周
生活随笔
收集整理的這篇文章主要介紹了
【思特奇杯·云上蓝桥·算法集训营】第四周
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.門牌制作
【問題描述】
小藍要為一條街的住戶制作門牌號。
這條街一共有2020位住戶,門牌號從1到2020編號。
小藍制作門牌的方法是先制作0到9這幾個數字字符,最后根據需要將字符粘貼到門牌上,例如門牌1017需要依次粘貼字符1、0、1、7,即需要1個字符0,2個字符1,1個字符7。
請問要制作所有的1到2020號門牌,總共需要多少個字符2?
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
答案:624
#include<stdio.h> int main() {int sum=0,p,q;for( q=1;q<=2020;q++){p=q;while(p){if(p%10==2){sum++;}p/=10;}}printf("%d",sum);return 0; }2.既約分數
答案:2481215
#include<stdio.h>int d(int m, int n) {if (m % n == 0){return n;}else{return d(n, m % n);}} int main() {int count = 0;for (int i = 1; i <= 2020; i++){for (int j = 1; j <= 2020; j++){if (d(i, j) == 1){count += 1;}}}printf("%d", count);}3.蛇形排列
答案:671
#include<stdio.h>int main() {int n = 20 * 2 - 1;int a = 0;int b = 0;for (int i = 1; i <= n; i++){a += i;}b = (a + a - n + 1) / 2;printf("%d ", b);return 0;}4.跑步鍛煉
答案:8879
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> int main() {int a=0;int m=6; int monthes[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i=2000; i<=2020; i++){if((i%4==0&&i%100!=0)||(i%400==0)){monthes[2]=29; }else{monthes[2]=28; }for(int month=1; month<=12; month++){for(int day=1; day<=monthes[month]; day++){a++;if(m==8){m=1;}if(m==1||day==1){a++;}m++;if(i==2020&&month==10&&day==1){printf("%d",a);}}}}return 0; }5.七段碼
答案:80
#include<iostream> #include<set> #include<cstring> using namespace std;int ve[7][7]; bool visit[7]; int ans = 0; set <set <int> > se; void dfs(int x,set<int> s) {if(!se.count(s)){se.insert(s);ans++;}if(s.size() == 7)return;for(int j = 0; j < 7; j++){if(visit[j] || !ve[x][j]) continue;s.insert(j);visit[j] = 1;dfs(j,s);visit[j] = 0;s.erase(j);} } void add(int x, int y) {ve[x][y] = 1;ve[y][x] = 1; } int main() {add(0,1);add(0,5);add(1,6);add(1,2);add(2,6);add(2,3);add(3,2);add(3,4);add(4,5);add(4,6);add(5,6);set<int> s;for(int i = 0; i <= 6; i++){s.insert(i);visit[i] = 1;dfs(i,s);visit[i] = 0;s.erase(i);}cout<<ans<<endl;return 0; }6.成績統計
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main() {int sum,temp;float p,excellence;int psum=0,excellencesum=0;scanf("%d",&sum);for(int i=1; i<=sum; i++){scanf("%d",&temp);if(temp>=60){psum++; }if(temp>=85){excellencesum++; }}p=(float)psum/sum*100; excellence=(float)excellencesum/sum*100; int a=(int)(p+0.5); int b=(int)(excellence+0.5);printf("%d%%\n%d%%",a,b); return 0; }7.回文日期
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main() {int sum,temp;float p,excellence;int psum=0,excellencesum=0;scanf("%d",&sum);for(int i=1; i<=sum; i++){scanf("%d",&temp);if(temp>=60){psum++; }if(temp>=85){excellencesum++; }}p=(float)psum/sum*100; excellence=(float)excellencesum/sum*100; int a=(int)(p+0.5); int b=(int)(excellence+0.5);printf("%d%%\n%d%%",a,b); return 0; }8.子串數值和(參考)
#include<iostream> #include<cstring> using namespace std; typedef long long ll; const int N = 1e5+10; char s[N]; ll f[N]; int last[30]; int main(){scanf("%s",s+1);int n = strlen(s+1);ll ans = 0;for(int i=1;i<=n-i+1;i++)f[i] = f[n-i+1] = (n-i+1)*(ll)i; for(int i = 1;i<=n;i++){int t = s[i]-'a';if(!last[t]){ ans += f[i];}else{ans += f[i] - f[i]/i*last[t]; }last[t] = i; }printf("%lld",ans);return 0; }9.平面切分
#include<iostream> #include<cmath> #define max_size 1010using namespace std; int ans=1; double jd[max_size][2];void f(int i,int arr[1010][2],int a,int b) {int temp=0;for(int j=1;j<i;j++){if(arr[j][0]==a){if(arr[j][1]==b) return;else continue;}else{jd[temp][0]=(b-arr[j][1])*1.0/(arr[j][0]-a);jd[temp][1]=a*1.0*jd[temp][0]+b;int flag=1;for(int k=0;k<temp;k++){if(abs(jd[k][0]-jd[temp][0])<1e-6&&abs(jd[k][1]-jd[temp][1])<1e-6){flag=0;break;}}if(flag==1){temp++;}}}ans=ans+temp+1; int main() {int num;cin>>num;int arr[1010][2];for(int i=1;i<=num;i++){cin>>arr[i][0]>>arr[i][1];f(i,arr,arr[i][0],arr[i][1]);}cout<<ans;return 0; }9.平面切分
#include<iostream> #include<cmath> #define max_size 1010using namespace std; int ans=1;//沒有直線時有一個平面 double jd[max_size][2];//交點可能含小數,故用float型void f(int i,int arr[1010][2],int a,int b) {int temp=0;//統計當前直線與在它之前直線的不同交點數for(int j=1;j<i;j++){if(arr[j][0]==a){if(arr[j][1]==b) return;//當加入直線與之前直線相同時,不會多出來平面else continue;//兩直線平行無交點}else{jd[temp][0]=(b-arr[j][1])*1.0/(arr[j][0]-a);//求交點x值jd[temp][1]=a*1.0*jd[temp][0]+b;//求交點y值int flag=1;for(int k=0;k<temp;k++){if(abs(jd[k][0]-jd[temp][0])<1e-6&&abs(jd[k][1]-jd[temp][1])<1e-6)//與之前交點相同,不做統計 浮點型有精度誤差,判斷差足夠小即可{flag=0;break;}}if(flag==1){temp++;}}}ans=ans+temp+1;//當前平面數=未加此直線的平面數+加入此直線時多出來的平面數 而多出來的平面數等于該直線與之前直線的不同交點數+1 } int main() {int num;cin>>num;int arr[1010][2];for(int i=1;i<=num;i++){cin>>arr[i][0]>>arr[i][1];f(i,arr,arr[i][0],arr[i][1]);//邊加入直線邊計算}cout<<ans;return 0; }10.字串排序
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; const int N = 1e5+5; char str[N]; int main(){int n; cin>>n;int r=0;while(r*(r+1)/2<n)r++;r++;int t=(r-1)*r/2-n;str[r-1]='a';for(int i=r-2;i>=0;i--){ if(t>r/2){str[i]=str[i+1];i--;str[i]=str[i+1];i--;t-=3;}else if(t>0){str[i]=str[i+1];i--;t--;}if(i>=0)str[i]=str[i+1]+1;}puts(str);return 0; }總結
以上是生活随笔為你收集整理的【思特奇杯·云上蓝桥·算法集训营】第四周的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android----banner使用详
- 下一篇: 解决paramiko.ssh_excep