您的位置:首页 > 其它

NENU 17级算法学习小组 Round 2 0530

2018-05-30 19:43 88 查看

题目链接

密码:12345678

A题:签到题,还是要注意输入的写法,还有就是做题不要用float,最好用double;不要用long,用long long。(有同学用long double,额,这个不怎么用......)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define ll long long
#define inf 100000010
#define maxn 100010
#define PI 3.1415927
using namespace std;
int main()
{
double r;
while(scanf("%lf",&r)!=EOF)
{
double v=r*r*r*4/3*PI;
printf("%.3f\n",v+1e-9);
}
return 0;
}
B题:简单题。有很多种写法都可以AC。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define ll long long
#define inf 100000010
#define maxn 100010
#define PI 3.1415927
using namespace std;
int main()
{
int y,m,d;
char a,b;
while(scanf("%d%c%d%c%d",&y,&a,&m,&b,&d)!=EOF)
{
int ans=0;
int c[13];
c[0]=0;
for(int i=1;i<=12;i++)
{
if(i==2)
continue;
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
c[i]=31;
else
c[i]=30;
}
if((y%4==0&&y%100!=0)||y%400==0)
c[2]=29;
else
c[2]=28;
for(int i=0;i<=m-1;i++)
ans+=c[i];
ans+=d;
cout<<ans<<endl;
}
return 0;
}
C题:大数阶乘,这题比较难。因为N最大可以是10000,所以N!用long long也存不下,long long最大能存下1e19(差不多),这个时候我们就要用数组来存了,“万进制”了解一下 。还有就是以后遇到这种连long long都存不下的大数问题,要么是有很巧妙的运算技巧,要么就是用数组来存,这点需要注意一下。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
#define inf 1000010
#define maxn 10010
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int a[10010];
a[0]=1;
int k=0;        //记录位数
for(int i=1;i<=n;i++)
{
int b=0;    //判断是否需要进位
for(int j=0;j<=k;j++)
{
a[j]=a[j]*i+b;
b=a[j]/10000;
a[j]%=10000;
}
if(b>0)
{
k++;
a[k]=b;
}
}
cout<<a[k];
for(int i=k-1;i>=0;i--)
printf("%04d",a[i]);
cout<<endl;
}
return 0;
}
D题:也是签到题。同样需要注意注意输入的写法。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define ll long long
#define inf 100000010
#define maxn 100010
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
double a[110];
int b=0,c=0,d=0;
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
if(a[i]<0)
b++;
if(a[i]==0)
c++;
if(a[i]>0)
d++;
}
cout<<b<<" "<<c<<" "<<d<<endl;
}
return 0;
}
E题:简单题。只需要找到最大的字符,记录下来,然后for循环,在最大的字符后边输出(max)即可。
#include<stdio.h>
#include<string.h>
int main()
{
int i,len,max;
char str[110];
while(scanf("%s",str)!=EOF)
{
len=strlen(str);
max=str[0];
for(i=1;i<len;i++)
if(str[i]>max)
max=str[i];
for(i=0;i<len;i++)
{
printf("%c",str[i]);
if(str[i]==max)
printf("(max)");
}
printf("\n");
}
return 0;
}
F题:简单题。只需要按题意将时间转换一下,然后注意输出格式就行了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define inf 100000010
#define maxn 100010
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
char a[100];
cin>>a;
int year,month,day,hour,minute,second;
year=(a[0]-48)*1000+(a[1]-48)*100+(a[2]-48)*10+a[3]-48;
month=(a[5]-48)*10+a[6]-48;
day=(a[8]-48)*10+a[9]-48;
hour=(a[11]-48)*10+a[12]-48;
minute=(a[14]-48)*10+a[15]-48;
second=(a[17]-48)*10+a[18]-48;
int h=hour;
if(hour==0||hour==12)
hour=12;
else
hour%=12;
printf("%02d/%02d/%04d-%02d:%02d:%02d",month,day,year,hour,minute,second);
if(h>=0&&h<12)
cout<<"am"<<endl;
else
cout<<"pm"<<endl;
}
return 0;
}
G题:本来是个简单题,但是因为输入的格式有很多(主要是空格的位置很皮),要分很多种情况写,这就使这道题变得很复杂,我个人也很烦做这种题 。你现在看我代码很短,但最开始做的时候,交上就WA了,debug的时候加了很多注释,试了很多种情况.......这道题我的代码写的很乱,这种题最好自己写,最好别看别人的代码,因为看着真的很乱。

如果下边的5组数据都过了,这题基本就过了。

复制双引号里的内容输入。

1:"                 "

    0

2:"     asdf as a"

    3

3:"    asdf    asdf   ds"

    2

4:"asdf   asdf    "

    1

5:直接输入回车

    0

其实还有一个思路:输入数组a,然后对数组a进行一个初始化。把它左边“一连串的”空格赋成'a'(可以是任何字母),再把它右边“一连串的”空格赋成'a'(可以是任何字母),这样就相当于把左右两端的空格给抹去了,对于中间的空格,至于要判断一下a[i]和a[i-1]是否都是空格,如果是的话,ans不加加。

这个题......评测数据有问题,有的同学,代码是错的(上边的第三组测试样例过不了,还有“ a a b",这组样例也过不了),但仍然ac了,还是要注意一下,以后可能就没这么幸运了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define inf 100000010
#define maxn 100010
using namespace std;
char a[10000010];
char b[100000][100];
int main()
{
while(gets(a))
{
int len=strlen(a);
if(strlen(a)==0)
{cout<<0<<endl;continue;}
int flaggg=0;
for(int i=0;i<len;i++)
{
if(a[i]!=' ')
flaggg++;
}
if(!flaggg)
{cout<<0<<endl;continue;}
if(strcmp(a,"#")==0)
break;
memset(b,0,sizeof b);
len=strlen(a);
int j=0;
int k=0;
int flag=0;
for(int i=0;i<len;i++)
{
if(a[i]!=' ')
{b[j][k]=a[i];k++;}
else
{
if(i-1>=0&&a[i-1]!=' ')
{j++;k=0;}
}
}
flaggg=0;
for(int i=0;i<strlen(b[j]);i++)
{
if(b[j][i]!=' ')
{flaggg++;break;}
}
if(!flaggg)
j--;
int ans=0;
for(int i=0;i<=j;i++)
{
int flagg=0;
for(int k=0;k<i;k++)
{
if(strcmp(b[i],b[k])!=0)
continue;
else
{flagg++;break;}
}
if(!flagg)
ans++;
}
cout<<ans<<endl;
}
return 0;
}
H题:这题是个博弈题(八什博弈)。

这里不讲,想看下边的链接,四种博弈的讲解,感觉讲的很不错。

https://blog.csdn.net/ac_gibson/article/details/41624623

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define inf 100000010
#define maxn 100010
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int n,m;
cin>>n>>m;
if(n%(m+1)==0)
cout<<"Rabbit"<<endl;
else
cout<<"Grass"<<endl;
}
return 0;
}
I题:较难,不过对于学过动态规划的同学来说,这道题真的非常简单,可以说是最基础的动态规划。

这题只需要一层一层往上推即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define inf 100000010
#define maxn 100010
using namespace std;
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int k,a[110][110];
cin>>k;
for(int i=1;i<=k;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
for(int i=k-1;i>=1;i--)
for(int j=1;j<=i;j++)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
cout<<a[1][1]<<endl;
}
return 0;
}
J题:找规律题。写出来前几项,发现规律a
=a[n-1]+a[n-1](n>=4)。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define inf 100000010
#define maxn 100010
using namespace std;
using namespace std;
int main()
{
int n;
cin>>n;
int a[50];
a[1]=0;
a[2]=1;
a[3]=2;
for(int i=4;i<50;i++)
a[i]=a[i-1]+a[i-2];
while(n--)
{
int m;
cin>>m;
cout<<a[m]<<endl;
}
return 0;
}








阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: