计概杂烩2017

2017计概期末

探险家丁丁

#include <stdio.h>
/* C语言初始模板程序 */
int main(void) {
double f;scanf("%lf",&f);
printf("%.5lf",5.0*(f-32)/9);
return 0;
}

摘礼物

#include <stdio.h>
int a[2000];
int main(void) {
int n,k,ans=0;scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
}scanf("%d",&k);
for(int i=1;i<=n;++i)
if(a[i]<=k)
++ans;
printf("%d\n",ans);
return 0;
}

计算菌落面积

#include <stdio.h>
/* C语言初始模板程序 */
int main(void) {
int n,m,ans=0;scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
int x;scanf("%d",&x);
ans+=x;
}
printf("%d\n",ans);
return 0;
}

相交的圆

#include <stdio.h>
int x[2000],y[2000],r[2000];
int main(void) {
int n;scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d%d%d",&x[i],&y[i],&r[i]);
for(int i=1;i<n;++i)
for(int j=i+1;j<=n;++j)
if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<(r[i]+r[j])*(r[i]+r[j]))
{
printf("Yes\n");
return 0;
}
printf("No\n");
return 0;
}

寻找最长公共前缀

/*code from jxl!!!orz*/
#include <stdio.h>
char a[256],b[256],c[256],d[256];
int main(void) {
// scanf("%s%s%s%s",a,b,c,d);
gets(a);gets(b);gets(c);gets(d);
int i=0;
for(int j=0;j<255;++j){
if(a[i]==b[i]){
i++;
}
else{
b[i]='\0';
i=0;
break;
}
}
for(int j=0;j<255;++j){
if(c[i]==b[i]){
i++;
}
else{
c[i]='\0';
i=0;
break;
}
}
for(int j=0;j<255;++j){
if(d[i]==c[i]){
i++;
}
else{
d[i]='\0';
i=0;
break;
}
}
puts(d);
return 0;
}

dalaojxl的代码,思想是两两比较找公共部分

特殊数之和

#include <stdio.h>
int main(void) {
int n,k,sum=0;scanf("%d%d",&n,&k);
for(int i=1;i<=n;++i)
{
sum+=k;
k=k*10+k%10;
}
printf("%d\n",sum);
return 0;
}

考察知识点:如何取一个数的第k位(使用/和%)

谁是冠军

#include <stdio.h>
int a[200][10];
int main(void) {
int n,maxi,maxsum=0;scanf("%d",&n);
for(int i=1;i<=n;++i)
{
int maxx=0,minx=100,sum=0;
for(int j=1;j<=5;++j)
{
scanf("%d",&a[i][j]);
if(maxx<a[i][j]) maxx=a[i][j];
if(minx>a[i][j]) minx=a[i][j];
sum+=a[i][j];
}
if(maxsum<sum-minx-maxx) maxsum=sum-minx-maxx,maxi=i;
}
printf("%d %d\n",maxi,maxsum);
return 0;
}

按题目要求记录和比较即可,细节比较多,写的时候多注意

趣味游戏大赛

#include <stdio.h>
int a[20],b[20],a1,b1;
int main(void) {
for(int i=1;i<=10;++i)
{
int x;scanf("%d",&x);
if(x%2) a[++a1]=x;
else b[++b1]=x;
}
for(int i=1;i<a1;++i)
for(int j=i+1;j<=a1;++j)
if(a[i]<a[j])
{int tmp=a[i];a[i]=a[j];a[j]=tmp;}
for(int i=1;i<b1;++i)
for(int j=i+1;j<=b1;++j)
if(b[i]>b[j])
{int tmp=b[i];b[i]=b[j];b[j]=tmp;}
for(int i=1;i<a1;++i) printf("%d ",a[i]);
if(a1&&b1) printf("%d ",a[a1]);
else if(a1) printf("%d\n",a[a1]);
for(int i=1;i<b1;++i) printf("%d ",b[i]);
if(b1) printf("%d\n",b[b1]);
return 0;
}

注意一些特殊情况的判断

购买礼物

#include <stdio.h>
int a[2000],b[2000];
int main(void) {
int n,m,ans=0;scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]);
for(int i=1;i<n;++i)
for(int j=i+1;j<=n;++j)
if(b[i]<b[j])
{
int tmp=b[i];b[i]=b[j];b[j]=tmp;
tmp=a[i];a[i]=a[j];a[j]=tmp;
}
for(int i=1;i<=n;++i)
{
if(m<a[i]) break;
m-=a[i];++ans;
}
printf("%d\n",ans);
return 0;
}

排序

字符统计

#include <stdio.h>
#include <string.h>
int b[400];
char c[400];
int main(void) {
int n;scanf("%d\n",&n);
for(int i=1;i<=n;++i)
{
for(int j=0;j<=200;++j) c[j]='\0';
gets(c);int l=strlen(c);
for(int j=0;j<l;++j)
{
if(c[j]!=' '){
++b[c[j]-'a'];
}
}
for(int j=0;j<=24;++j)
{
printf("%d ",b[j]);
b[j]=0;
}
printf("%d\n",b[25]);b[25]=0;
}
return 0;
}

建议使用gets读入,注意回车的过滤。(第8行)

最佳凑单

#include <stdio.h>
int n,t,cnt=1,ans,minx=1000000000;
int a[100];
int main(void) {
scanf("%d%d",&n,&t);
for(int i=1;i<=n;++i,cnt*=2) scanf("%d",&a[i]);
for(int i=0;i<cnt;++i)
{
int i1=i;ans=0;
for(int j=1;j<=n;++j)
{
ans+=a[j]*(i1%2);
i1/=2;
}
if(ans>=t&&minx>ans) minx=ans;
}
if(minx==1000000000) printf("0\n");
else printf("%d\n",minx);
return 0;
}

方法一递归:每次选一件商品,然后递归将问题转化成已经解决的问题,就不放代码了(因为我没写

方法二状态压缩:考虑到每种物品都只有买或不买两种选择,我们用一个n位二进制数来储存n件商品购买时所有可能的情况,去最后一位(1或0)直接%2即可,代码见上

posted @   hcx1999  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示