比赛链接:
https://cn.vjudge.net/contest/191248
密码:nyist
弱校新生题解,大牛速速离去~
输出A*2+ B和A+B*2 较大的一个
#include
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int t,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
printf("%d\n",max(a*2+b,a+b*2));
}
return 0;
}
直接计算即可
#include
#include
using namespace std;
char s[20];
int main()
{
int t,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
int len=strlen(s);
int sum=0;
for(int i=0; iif(s[i]=='C')
sum+=12;
if(s[i]=='H')
sum+=1;
if(s[i]=='O')
sum+=16;
}
printf("%d\n",sum);
}
return 0;
}
写一个判断素数的函数,直接暴力即可
#include
#include
int prime(int x)
{
int i,flag=1;
for(i=2; i<=sqrt(x); i++)
{
if(x%i==0)
flag=0;
}
return flag;
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=0&&n)
{
j=0;
for(i=2; i2; i++)
{
if(prime(i)&&prime(n-i))
j++;
}
printf("%d\n",j);
}
return 0;
}
对于要计算的数,直接对100取模即可
#include
int main()
{
int a,b,c,d,n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
c=a%100;
d=b%100;
printf("%d\n",(c+d)%100);
}
}
通过枚举,可以暴力水过
#include
int main()
{
int n,m;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(m==0&&n==0)
return 0;
int flag=0;
for(int i=-1000; i<=10000; i++)
{
if(i*(m-i)==n)
{
printf("Yes\n");
flag=1;
break;
}
}
if(flag==0)
printf("No\n");
}
return 0;
}
我们把题目转化成多重背包的思路来理解。
先看一下多重背包的一般定义:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件重量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
在这个题目里面就是:
有26个物品,背包的容量为50,每一件物品的数量题目已经给出,现在就剩下每一个物品的重量,我们可以直接用字母的标号1-26代替.
先定义状态:dp[i][j]表示有i个字母,总价值为j的时候,符合条件的单词数量
我们可以得到状态转移方程:
#include
#include
int dp[55][55];
int w[30],num[30];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
memset(w,0,sizeof(w));
for(int i=1; i<=26; i++)
{
w[i]=i;
scanf("%d",&num[i]);
}
dp[0][0]=1;
for(int i=1; i<=26; i++)
for(int j=0; j<=50; j++)
for(int k=0; k<=num[i]&&k*w[i]<=j; k++)//k代表字母的数量,w[i]代表不同的字母
dp[i][j]+=dp[i-1][j-k*w[i]];
int ans=0;
for(int i=1; i<=50; i++)
ans+=dp[26][i];
printf("%d\n",ans);
}
return 0;
}
回顾一下我们学过的向量的知识,利用两条边来计算夹角
#include
#include
#define PI 3.1415926535;
int main()
{
double x1,x2,y1,y2;
int T;
double a,b,c;
while(scanf("%d",&T)!=EOF)
{
while(T--)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
a=x1*x2+y1*y2;
b=sqrt(x1*x1+y1*y1)*sqrt(x2*x2+y2*y2);
c=acos(a/b)/PI;
c*=180;
printf("%.2lf\n",c);
}
}
return 0;
}
加深一下对字符串的理解,字符串可以如何输出
#include
int main()
{
int n,i;
char a[12];
scanf("%d",&n);
while(n--)
{
scanf("%s",a);
printf("6%s\n",a+6);
}
}
考察一下什么是c语言合法标识符
#include
#include
char a[66];
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
gets(a);
int l=strlen(a);
if(a[0]=='_'||(a[0]>='a'&&a[0]<='z')||(a[0]>='A'&&a[0]<='Z'))
{
int m=0;
for(int i=1; iint flag=0;
if(a[i]=='_'||(a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')||(a[i]>='0'&&a[i]<='9'))
{
flag=1;
}
if(flag==0)
{
printf("no\n");
m=1;
break;
}
}
if(m==0)
printf("yes\n");
}
else
printf("no\n");
}
return 0;
}
模拟题,每个人的答案可能不一样,代码仅供参考
这种题一般就是看图找规律+模拟
#include
#include
char e[85][85];
char op1[2],op2[2];
int main()
{
int n,T=0;
while(~scanf("%d %s %s",&n,op1,op2))
{
if(T)puts("");
if(n==1)
{
printf("%c\n",op1[0]);
continue;
}
char x,a=op1[0],b=op2[0];
int tmp=1;
if(((n+1)/2)%2==1)
{
char c=a;
a=b;
b=c;
}
while(tmp<=(n+1)/2)
{
int m=n-tmp+1;
if (tmp%2==1)x=b;
else x=a;
for(int i=tmp; i<=m; i++)
{
e[tmp][i]=x;
e[m][i]=x;
e[i][tmp]=x;
e[i][m]=x;
}
tmp++;
}
e[1][1]=e[n][n]=e[1][n]=e[n][1]=' ';
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
printf("%c",e[i][j]);
puts("");
}
T++;
}
return 0;
}