计概杂烩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个数最小,可以用前缀和处理。
前缀和:设\(b[1]=a[1],b[i]=b[i-1]+a[i](i>=2)\)
(即\(b[i]=a[1]+a[2]+...+a[i]\))
那么a数组中间第i个到第i+m个的和就是\(b[i+m]-b[i-1]\)
这样就避免了一次一次计算的超时。
可能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;
}