题目总链接:
https://nuoyanli.com/contest/31/problems
A.我是个签到题!
题目链接:
https://nuoyanli.com/contest/31/problem/A
题面:
题意:
题目意思相当简单,就是判断是否存在整数满足这个等式,如果存在就输出YES,不存在就NO。
思路:
这道题目就是费马大定理,自行百度。此处不做解释。
参考代码:
#include<stdio.h>
int main()
{
printf("NO");
return 0;
}
B.我是简单题!
题目链接:
https://nuoyanli.com/contest/31/problem/B
题面:
题意:
输入一个t代表t组输入,每组输入初始幸福值m,和每次减低的幸福值k,然后输入点赞人数和字符s,判断接下来的n行中人的名字是以字符s开头或者结尾就帮忙点赞(当幸福值降为0或者小于0就不会继续帮忙点赞)
思路:
这道题目整体没有很难,我们先对名字以字符s开头或者结尾的人名进行点数,判断这个人最多帮多少人点赞,然后在通过一个for来判断幸福值是否支持他将这些人全部点赞完。
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int m,k,n,ans=0,i,len,sum=0;
char ch;
char a[1000];
scanf("%d%d%d ",&m,&k,&n);
scanf("%c",&ch);
for(i=0;i<n;i++)
{
scanf("%s",a);
len=strlen(a);
if(a[0]==ch||a[len-1]==ch)//判断字符串的开头和结尾是否存在与输入的字符相同
{
ans++;//判断不考虑幸福值的情况下,需要帮助的总人数。
}
}
sum=m;
for(i=0;i<ans;i++)
{
sum=sum-k;
if(sum<=0)//判断初始幸福值能够支持帮助几个人
{
ans=i+1;
}
}
if(m==0) ans=0;
if(ans!=0)
printf("%d\n",ans);
else printf("NICE DAY!\n");
}
return 0;
}
C.我才是简单题!
题目链接:
https://nuoyanli.com/contest/31/problem/C
题面:
题意:
多组输入,每行输入一个整数n,第二行有n个整数代表每种布的价格,然后输出需要买完所有布的最低消费。
思路:
这个题目中买布的规则为提前去买没有出场的布,就需要将布的价格乘以天数,而我们需要花费最少,钱为正值的一定会按顺序买,这样子是最划算的情况,而为负数的肯定是先买最后出现的,这时候如果为负数的就直接乘以他出现时的天数,而为正数的话就直接为他的价格。这时候就是消费最小的情况。(题目数据给的特别大,这时候我们需要使用long long 形的数据类型)。
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
long long n;
while(scanf("%lld",&n)!=EOF)
{
long long a,i;
long long sum=0;
for(i=1; i<=n; i++)
{
scanf("%lld",&a);
if(a<0)//判断价格是否小于0
{
sum=sum+a*i;//小于则直接乘以他出现时的天数
}
else sum=sum+a;//为正数就直接价格相加
}
printf("%lld\n",sum);
}
}
D.暴力我啊!
题目链接:
https://nuoyanli.com/contest/31/problem/D
题面:
题意:
多组输入,每行输入一个n,m,接下来n行每行n个整数,表示第几行第几列存在多少个敌人。然后选择m*m的范围继续轰炸,求最多能够击杀的敌人人数。
思路:
这道题目暴力就对了,可以直接4层for循环,也可以向我这样用两个while和两个for,就是先每次不断向右边平移,然后在回到初始地点向下平移,之后在向右边平移。然后对每种轰炸情况的人数进行排序,输出最大值。
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;//定义一个函数使得sort从大到小排序
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
int a[n+10][n+10];
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d",&a[i][j]);
}
}
int x,y,o=0,p=0,k;
int b[10000];
for(i=0; i<10000; i++)
{
b[i]=0;
}
x=m;
y=m;
k=0;
while((x+o)<=n)
{
p=0;//将列重新从0开始又右边平移
while((y+p)<=n)
{
for(i=o; i<n; i++)
{
for(j=p; j<n; j++)
{
if(j<y+p&&i<x+o)
{
b[k]=b[k]+a[i][j];
}
}
}
p=p+1;//不断向右平移一格
k=k+1;
}
o=o+1;//当向右平移到n时,这时候向下平移一格
}
sort(b,b+k,cmp);//对每种情况的轰炸人数进行从大到小的排序
printf("%d\n",b[0]);
}
return 0;
}
E.暴力啥啊!
题目链接:
https://nuoyanli.com/contest/31/problem/E
题面:
题意:
多组输入,每组第一行给一个整数n,接下来一行有n个整数输入,判断哪两个点的斜率最大。
思路:
这道基本思路就是求这些点当中的最大斜率,我们可以通过画三角形可以看出来,斜率最大的一定是相邻两个点之间,所以这道题目我们只需要枚举相邻两点之间的斜率大小进行比较,输出最大的那个斜率即可。
参考代码:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
double maxn = -2e9-5, a, b;//将最大值的初始值定义到足够小
scanf("%lf",&a);
while(--n)//进行n-1次循环
{
scanf("%lf",&b);
if(b-a > maxn)
{
maxn = b-a;
}
a = b;
}
printf("%.2lf\n",maxn);
}
return 0;
}
F.我也是个签到题!
题目链接:
https://nuoyanli.com/contest/31/problem/F
题面:
题意:
输入一个正整数T,代表有T组输入,每次输入就一个整数n,然后判断这个数字n的十二进制,十六进制,十进制的各位数相加相等。如果相等就满足特别的三位数,则输出Specializ!!!,否则就输出disappointment…。
思路:
这个题目与计算十进制的各位相加之和基本类似,就是通过不断求余与除法来求出每一位,然后相加,最后判断是否是否都是相等的就可以了。
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int k,m,n,o,sum=0,sum1=0,sum2=0,x,l;
scanf("%d",&n);
k=n;
m=n;
x=n;
while(k!=0)
{
o=k%16;
sum=sum+o;
k=k/16;
}//十六进制的各位数之和
while(m!=0)
{
l=m%12;
sum1=sum1+l;
m=m/12;
}//十二进制的各位数之和
while(x!=0)
{
o=x%10;
sum2=sum2+o;
x=x/10;
}//十进制的各位数之和
if(sum1==sum2&&sum2==sum)//判断是否相等
{
printf("Specializ!!!\n");
}
else
printf("disappointment....\n");
}
return 0;
}
G.我才是个签到题!
题目链接:
https://nuoyanli.com/contest/31/problem/G
题面:
题意:
首先输入一个n,代表n个同学,之后n行依次输入一个学生的姓名,学号,性别。之后输入一个m,代表询问的问题,之后m行输入两个信息(姓名或者学号)如果这两个信息对应的人为性别不同就可以一起玩游戏,输出Y,如果对应的人性别相同,则输出n。
思路:
这道题目考察我们的是结构体的应用以及strcmp应用
注:strcmp为字符串函数,使用他时头文件中应该有#include<string.h>,然后strcmp的基本格式为strcmp( a,b),a,b为字符串,如果a<b则返回负数,如果a=b则返回0,如果a>b则返回正数。所以判断两个字符串是否相等就只需要判断strcmp(a,b)==0 ,如果为0则两个字符串相等。
我们定义一个结构体将一个学生的基本信息存储在一个结构体中,然后输入,之后输入的m组两个人的信息我们可以进行依次检索,使用strcmp来判断各个信息对应的人,然后同时进行比较对应的人的性别,从而来判断是否可以一起玩游戏。
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct p
{
char m[100];//姓名
char x[100];//学号
char xing[100];//性别
} a[1100];
int main()
{
int n,i,m;
char b[1000];
char c[1000];
char u[1000];
char k[1000];
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%s %s %s",a[i].m,a[i].x,a[i].xing);
}
scanf("%d",&m);
while(m--)
{
scanf("%s %s",b,c);
for(i=0; i<n; i++)//对其进行检索
{
if(strcmp(b,a[i].m)==0||strcmp(b,a[i].x)==0)//来判断后面输入的信息所对应的人
{
u[0]=a[i].xing[0];//将对应的人的性别赋值给一个字符串
}
if(strcmp(c,a[i].m)==0||strcmp(c,a[i].x)==0)
{
k[0]=a[i].xing[0];
}
}
if(u[0]!=k[0])//判断所对应两个人的性别是否相同
{
printf("Y");
}
else
printf("n");
if(m!=0) printf("\n");
}
return 0;
}
H.巧了,我是真正的签到题!
题目链接:
https://nuoyanli.com/contest/31/problem/H
题面:
题意:
这道题目就是一个简单的if判断的简单题
思路:
我们就是不断使用if来判断输入的字符属于哪个数字就行了。
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int i,len;
char a[1000];
scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]=='a'||a[i]=='b'||a[i]=='c')
{
printf("2");
}
else if(a[i]=='e'||a[i]=='f'||a[i]=='d')
{
printf("3");
}
else if(a[i]=='h'||a[i]=='i'||a[i]=='g')
{
printf("4");
}
else if(a[i]=='j'||a[i]=='k'||a[i]=='l')
{
printf("5");
}
else if(a[i]=='m'||a[i]=='n'||a[i]=='o')
{
printf("6");
}
else if(a[i]=='p'||a[i]=='q'||a[i]=='r'||a[i]=='s')
{
printf("7");
}
else if(a[i]=='t'||a[i]=='u'||a[i]=='v')
{
printf("8");
}
else if(a[i]=='w'||a[i]=='x'||a[i]=='y'||a[i]=='z')
{
printf("9");
}
else
{
printf("1");
}
}
if(n!=0) printf("\n");
}
return 0;
}
I.我是个防AK题你信吗?
题目链接:
https://nuoyanli.com/contest/31/problem/I
题面:
题意:
输入一个T,代表T组输入,然后输入一个字符串,判断这个字符串中字符能够组成多少个lwp。
思路:
这道题目的基本思路就是一个简单的if,我们通过用for来一个个继续判断,然后统计大小写的l与大小写的w还是大小写的p的数目,然后判断数目最少的那种,就是可以组成的lwp的数目。
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int b[10];
char a[10000];
int len,i,j,m=0,p=0,k=0;
scanf("%s",a);
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]=='l'||a[i]=='L')
{
m++;//计算出现大小写的l的次数
}
if(a[i]=='w'||a[i]=='W')
{
k++;//计算出现大小写的w的次数
}
if(a[i]=='p'||a[i]=='P')
{
p++;//计算出现大小写的p的次数
}
}
b[0]=m;
b[1]=k;
b[2]=p;
sort(b,b+3);//对lwp各个字符出现的次数继续从小到大排序
printf("%d\n",b[0]);//输出出现次数最少的那个,就是组成lwp的数目
}
return 0;
}
J.听取wa声一片
题目链接:
https://nuoyanli.com/contest/31/problem/J
题面:
题意:
题目意思十分简单,就是输出不换箱子得到宝箱的概率,和换了箱子得到宝箱的概率,中间用空格隔开,保留3位小数。
思路:
这道题目基本思路就是概率问题,因为主持人是知道宝箱在哪个箱子的,他一定会先看没有宝箱的箱子,这时候我们不需要考虑主持人开的是哪个箱子,就3个箱子中就存在一个宝箱,直接拿到宝箱的概率就是三分之一,而换箱子得到宝箱和不换箱子得到宝箱是对立的两个事件,所以当不换箱子得到宝箱的概率为三分之一时,另一种情况的答案就为三分之二。
参考代码:
#include<stdio.h>
int main()
{
printf("0.333 0.667");
return 0;
}