计概杂烩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即可,代码见上

浙公网安备 33010602011771号