计概杂烩2018
2018计概期末
就医问题
#include <stdio.h> /* C语言初始模板程序 */ int main(void) { char a[2]={'B','A'}; int x;scanf("%d",&x);printf("%c\n",a[x%2]); return 0; }
马虎的佩奇
#include <stdio.h> #define eps 0.000006 #include<math.h> int main(void) { double v1,v2,t,s; scanf("%lf%lf%lf%lf",&v1,&v2,&t,&s); if(s/v1-s/v2>=t&&v2>v1) printf("YES\n"); else printf("NO\n"); return 0; }
多多爱赚零花钱
#include <stdio.h> /* C语言初始模板程序 */ int main(void) { double ans=0; for(int i=1;i<=12;++i) { double x;scanf("%lf",&x); ans+=x; } printf("$%.2lf\n",ans/12); return 0; }
因子问题
#include <stdio.h> /* C语言初始模板程序 */ int main(void) { int n,m;scanf("%d%d",&n,&m); for(int i=1;i<m;++i) if(n%i==0&&n%(m-i)==0) { printf("%d\n",i);return 0; } printf("-1\n"); return 0; }
基因编辑
#include <stdio.h> #include <string.h> /* C语言初始模板程序 */ int main(void) { char c[300];gets(c); for(int i=strlen(c)-1;i>0;--i) if(c[i]=='T'&&c[i-1]=='G') c[i]='G'; puts(c); return 0; }
注意陷阱GGT的情况要变成GTT而不是TTT,这里我采用了倒序的方式避免这种情况(也可以直接换个数组
孪生素数
#include <stdio.h> int p(int x) { for(int i=2;i<=x-1;++i) if(x%i==0) return 0; return 1; } int main(void) { int m;scanf("%d",&m); for(int i=m;;--i) { if(p(i-2)&&p(i)) { printf("%d %d\n",i-2,i); return 0; } } return 0; }
判断素数的时候到sprtx即可,注意有时需要特判1和0
海王
#include <stdio.h> int main(void) { int n,ans=1;scanf("%d",&n); for(int i=1;i<n;++i) ans=(ans+1)*2; printf("%d\n",ans); return 0; }
找规律写数即可
筛选病人
#include <stdio.h> #include <string.h> struct pa{ char name[10]; int age; float tem; int b; }a[400],d[400]; int main(void) { int n,cnt=0;scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%s%d%f%d",a[i].name,&a[i].age,&a[i].tem,&a[i].b); if(a[i].tem<37.5) a[i].b=0; if(a[i].b==1) d[++cnt]=a[i]; } for(int i=1;i<cnt;++i) for(int j=i+1;j<=cnt;++j) { if(d[i].age<d[j].age||(d[i].age==d[j].age&&strcmp(d[i].name,d[j].name)>0)) { struct pa tmp=d[i];d[i]=d[j];d[j]=tmp; } } for(int i=1;i<=cnt;++i) printf("%s %d %g\n",d[i].name,d[i].age,d[i].tem); return 0; }
编程网格好像是不支持typedef为啥啊好离谱
谁能拿到最多的硬币
#include <stdio.h> long long a[200000],b[200000]; int main(void) { long long n,k,ans=10000000000;scanf("%lld%lld",&n,&k); for(int i=1;i<=n;++i) { scanf("%lld",&a[i]); b[i]=b[i-1]+a[i]; } for(int i=1;i<=k;++i) { if(ans>b[i+n-k]-b[i]) ans=b[i+n-k]-b[i]; } printf("%lld\n",b[n]-ans); return 0; }
思路:删除两边的k个数就相当于留下中间的n-k个数,使中间连续n-k个数最小,可以用前缀和处理。
前缀和:设
(即
那么a数组中间第i个到第i+m个的和就是
这样就避免了一次一次计算的超时。
可能int装不下要开longlong
迷信的病人
#include <stdio.h> #include <math.h> int isPrime(int x) { if(x<=1) return 0; int m=sqrt(x); for(int i=2;i<=m;++i) if(x%i==0) return 0; return 1; } int isSquare(int x) { if(x==0) return 0; int m=sqrt(x); if(x==m*m) return 1; return 0; } int id(int x) { if(isPrime(x/1000000)==0) return 0; if(isSquare(x%1000)==0) return 0; for(int i=1;i<=9;++i) { if(x<=10) break; if(x%100==13) return 0; x/=10; } return 1; } int main(void) { int m,n,ans=0;scanf("%d%d",&m,&n); for(int i=m;i<=n;++i) if(id(i)) ++ans; printf("%d\n",ans); return 0; }
拼图题,分别写判断平方数和判断素数的条件即可。
明哥之问
先说思路:约瑟夫的逆向搞法。
设f(n,m)表示n个人数到m出局最终剩下的人的编号。
则f(n,m)=(f(n-1,m)+m-1)%n+1;
正向解决约瑟夫问题的时候用的是递归,从f(1,m)=1推到f(n,m)
逆向就是循环到f(i,m)==k符合题意了为止。
至于公式的推导这篇文章讲的明白
上代码:
#include <stdio.h> int main(void) { int m,k,now=1;scanf("%d,%d",&m,&k); if(now==k) { printf("1\n"); return 0; } for(int i=1;;++i) { now=(now+m-1)%i+1; if(now==k) { printf("%d\n",i); return 0; } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】