计概杂烩2022
2022期末
直角三角形的面积
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,c;scanf("%d%d%d",&a,&b,&c);
double p=(a+b+c)/2;
double s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("%.2lf\n",s);
return 0;
}
忘记是直角三角形了(逃
编程语言
#include <stdio.h>
#include <string.h>
int v;char a[200];
int main(void) {
scanf("%d\n",&v);
while(1){
gets(a);
if(strcmp(a,"0")==0) break;
if(strcmp(a,"++V")==0||strcmp(a,"V++")==0) v++;
if(strcmp(a,"--V")==0||strcmp(a,"V--")==0) v--;
}
printf("%d\n",v);
return 0;
}
使用strcmp函数方便的进行字符串比较
涨价的门票
#include <stdio.h>
int main(void) {
int n,m,v,a,ans=0;scanf("%d%d%d%d",&n,&v,&m,&a);
for(int i=1;i<=n;++i)
{
ans+=v;
if(i%m==0) v+=a;
}
printf("%d\n",ans);
return 0;
}
密文破译
#include <stdio.h>
#include<string.h>
int main(void) {
char a[200];int n;gets(a);scanf("%d",&n);
for(int i=0;i<strlen(a);++i)
{
int x=a[i]-'A';
x=(x-n+26)%26;
printf("%c",x+'A');
}
return 0;
}
小P考试
#include <stdio.h>
double a[1000];
int main(void) {int t;scanf("%d",&t);
while(t--){
int n;scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lf",&a[i]);
for(int i=1;i<n;++i)
for(int j=i+1;j<=n;++j)
if(a[i]>a[j])
{double tmp=a[i];a[i]=a[j];a[j]=tmp;}
if(n%2) printf("%.1lf\n",a[n/2+1]);
else printf("%.1lf\n",1.0*(a[n/2]+a[n/2+1])/2);
}
return 0;
}
世界杯赢家
#include <stdio.h>
int a[200000],b;
int main(void) { int n;scanf("%d",&n);
for(int i=1;i<=n;++i)
{
int x,y;scanf("%d%d",&x,&y);
if(a[x]!=1) a[x]++;
a[y]+=2;
}
for(int i=1;i<=100000;++i)
{
if(a[i]==1)
if(b) printf(", %d",i);
else {printf("%d",i);b=1;}
}
return 0;
}
善用标注,减小代码复杂度
找出密码
#include <stdio.h>
#include <string.h>
char a[20000];
int main(void) {
int i=0;
while(scanf("%s",a)!=EOF)
{
int l=strlen(a);
printf("%c",a[i++%l]);
}
return 0;
}
这里需要用到scanf的返回值:
(1)如果全部或部分正常输入,scanf返回成功输入的数据的个数
(2)如果检测到结束(即全部没有正常输入)则返回EOF(EOF=-1,是个常数)
这样可以写的简洁一点
请佩戴好口罩
#include <stdio.h>
int a[200][200],b[200][200];
int ans;
int x1[4]={0,0,1,-1};
int y1[4]={1,-1,0,0};
void f(int x,int y)
{
if(a[x][y])
{
b[x][y]=2;
for(int i=0;i<4;++i)
if(b[x+x1[i]][y+y1[i]]!=1||a[x+x1[i]][y+y1[i]]==1)
{b[x][y]=0;break;}
}
else
{
for(int i=0;i<4;++i)
if(b[x+x1[i]][y+y1[i]]==1&&a[x+x1[i]][y+y1[i]]==0)
{b[x][y]=2;break;}
}
}
int main(void) {
int n;scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&a[i][j]);
int x,y,d;scanf("%d%d%d",&x,&y,&d);
b[x+1][y+1]=1;
while(d--)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(b[i][j]==0)
f(i,j);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(b[i][j]==2)
b[i][j]=1,++ans;
}
printf("%d\n",ans+1);
return 0;
}
纯模拟,细节较多,多注意一下即可
叠盘子
#include <stdio.h>
int a[2000],b[2000],f[2000];
int n,ans;
int main(void) {
scanf("%d",&n);
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(a[i]>a[j]||(a[i]==a[j]&&b[i]>b[j]))
{int tmp=a[i];a[i]=a[j];a[j]=tmp;
tmp=b[i];b[i]=b[j];b[j]=tmp;}
for(int i=1;i<=n;++i)
{
for(int j=1;j<i;++j)
{
if(b[i]>b[j]&&f[i]<f[j]+1)
f[i]=f[j]+1;
}
if(ans<f[i]) ans=f[i];
}
printf("%d\n",ans+1);
return 0;
}
先按照一个数组排序,那么答案就是另一个数组中最长上升子序列的长度,这个比较容易理解(?)
然后就是经典的求最长上升子序列(LIS):使用原始的\(n^2\)解法即可\(f[i]=max\{f[j]\}+1(0<j<i)\)
完结撒花!★,°:.☆( ̄▽ ̄)/$:.°★ 。