牛客小白月赛21总结
PS:又是一场自闭场,前期跟榜,15分钟左右迅速切了三道题,当时排名第5名(还特意截了个图去装了个逼 )
(学校就不露了,一所双非院校,哈哈哈)
但是后面真的好难受啊,一直wa一直爽 是不可能的,搞的心态爆炸,然后看了看排名就一直在100名左右徘徊,最后一个小时就围着E、J、I。我真的感觉E不是一般的无语,开始成绩要保留整数然后四舍五入;最后的绩点又是保留两位小数四舍五入。一直wa了好多次,最后的代码觉得没问题了,但是还是wa了,无语…
最后只做出来5题,排名177,我哭辽
最后十分钟直接放弃,打了把王者,才过来补题
A:Audio
题意:
还是很好懂的,就是求由三个顶点组成的三角形的外心
题解:
多亏我有三角形外心的模板,于是偷了一波懒,直接copy了一下,于是在15分钟左右切了这题,也是我切的第三题
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000;
typedef struct Point{
double x,y;
Point(double xx,double yy){
x=xx;
y=yy;
}
};
Point waixin(Point a,Point b,Point c){
double a1=b.x-a.x,b1=b.y-a.y,c1=(a1*a1+b1*b1)/2;
double a2=c.x-a.x,b2=c.y-a.y,c2=(a2*a2+b2*b2)/2;
double d=a1*b2-a2*b1;
return Point(a.x+(c1*b2-c2*b1)/d,a.y+(a1*c2-a2*c1)/d);
}
int main(){
double xx,yy;
scanf("%lf%lf",&xx,&yy);
Point a=Point(xx,yy);
scanf("%lf%lf",&xx,&yy);
Point b=Point(xx,yy);
scanf("%lf%lf",&xx,&yy);
Point c=Point(xx,yy);
Point d=waixin(a,b,c);
printf("%.3f %.3f\n",d.x,d.y);
return 0;
}
B:Bits
这种大模拟的题,真的是望虎生畏、望洋兴叹,最终没做出来
C:Channels
题意:
开始一看,还以为是一道贪心的水题,但是看了下题目后,就是每个活动都是60分钟一个周期,50分钟有内容,10分钟广告;然后给你一段时间的起点和终点,要你求他能看多少时间的内容(不包括广告)
题解:
这题还是有点小坑的,搞的心态也有点炸,主要就是开始没有考虑到广告时间不包括。起初想的是:起点可以转化为前面最近的那个起点t1,同时计算还剩下的一部分的时间x1;终点也就是类似的思路:求得后面最近的那个终点t2,同时计算多出来的那一部分时间x2。主要是没考虑到x1、x2会大于50,然后成功贡献了三发wa
后面不知道又是什么原因,就算改过来了,还是有点小问题,于是直接将题目中的从1开始转化为了从0开始,才得以AC
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<map>
#include<list>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const ll maxn=500000;
int main(){
ll t1,t2;
ll x1,x2;
ll num;
while(~scanf("%lld%lld",&t1,&t2)){
t1=t1-1;
t2-t2-1;
x1=t1%60;
if(x1>=50)
x1=50;
x2=t2%60;
if(x2>=50){
x2=50;
}
t1=t1-t1%60;
t2=t2-t2%60;
num=(t2-t1)/60;
//cout<<x1<<" "<<x2<<" "<<t1<<" "<<t2<<endl;
printf("%lld\n",num*50+x2-x1);
}
return 0;
}
D:DDoS
感觉并不适合我,直接跳过,哈哈哈
E:Exams
题意:
题意还是比较容易理解,主要是坑太多了。。。
每科的成绩要保留整数(四舍五入),然后学分绩点保留两位有效数字(四舍五入)
关键四舍五入我还以为电脑自动是的,原来还是要自己实现。。。
题解:
感觉后面的坑都找到了,但是最终还是一直wa,看了题解,感觉自己根本没错啊,一脸懵逼
wa的代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<map>
#include<list>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const ll maxn=100;
int n;
struct node{
int flag;
double credit;
double grade1,num1,grade2,num2,grade3,num3;
};
node a[maxn];
double sum=0;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i].flag>>a[i].credit>>a[i].grade1>>a[i].num1>>a[i].grade2>>a[i].num2>>a[i].grade3>>a[i].num3;
sum+=a[i].credit;
}
double num=0;
for(int i=1;i<=n;i++){
if(a[i].flag==2)
continue;
int x=(int)a[i].grade1*a[i].num1+a[i].grade2*a[i].num2+a[i].grade3*a[i].num3+0.5;
//printf("%d\n",x);
num+=x*a[i].credit*1.0/sum*1.0;
}
num=(num*100+0.5)/(100*1.0);
printf("%.2f\n",num);
return 0;
}
F:Fool Problem
题意:
就是斐波拉契相关题。。。
题解:
开始看题就觉得是大数,于是立马打开了eclipse,乘着打开的时间继续看题,发现居然不是大数,开始尝试了一下打表,居然秒出规律,还能说啥——暴力出奇迹
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000;
int main(){
string str;
cin>>str;
int len=str.length();
int num=str[len-1]-'0';
if(num%2==0){
printf("1\n");
}
else{
printf("-1\n");
}
return 0;
}
G:Game
题意:
给定一个正整数,两个人玩游戏,然后每个人可以将集合中的数分解成两个因数(前提是不能有1)
问:最后到谁的时候不能再分
题解:
就是一道比较简单的博弈题,但是还是没有做出来。。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000;
int n;
int main() {
cin>>n;
if(n==1) {
printf("Nancy\n");
}
else {
int ans=0;
for(int i=2; i<=n; i++) {
if(n%i==0){
while(n%i==0){
n/=i;
ans++;
}
}
}
if(ans%2==0) {
printf("Johnson\n");
}
else {
printf("Nancy\n");
}
}
return 0;
}
H:”Happy New Year!“
大水题,不多解释
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=100000;
int main(){
printf("\"Happy New Year!\"");
return 0;
}
I:I love you
题意:
给你一个字符串,求序列"i love you"的个数(不区分大小写)
题解:
没做出来。。。。,虽然知道是DP,而且最近练的也是DP,但是还是没有做出来。。。
看官方题解说居然和小白赛3的一题是一样的,换汤不换药
这是小白月赛3的题解,于是自己动手改了改
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1000;
string str;
int len;
int dp[10];
const int mod=20010905;
int main(){
memset(dp,0,sizeof(dp));
cin>>str;
len=str.length();
//都转化为小写
for(int i=0;i<len;i++){
str[i]=tolower(str[i]);
}
for(int i=0;i<len;i++){
dp[1]=(dp[1]+(str[i]=='i'))%mod;
dp[2]=(dp[2]+(str[i]=='l')*dp[1])%mod;
dp[3]=(dp[3]+(str[i]=='o')*dp[2])%mod;
dp[4]=(dp[4]+(str[i]=='v')*dp[3])%mod;
dp[5]=(dp[5]+(str[i]=='e')*dp[4])%mod;
dp[6]=(dp[6]+(str[i]=='y')*dp[5])%mod;
dp[7]=(dp[7]+(str[i]=='o')*dp[6])%mod;
dp[8]=(dp[8]+(str[i]=='u')*dp[7])%mod;
}
printf("%d\n",dp[8]);
return 0;
}
不得不说DP真的太活了。。。还是做的题不够,这道题按道理应该要做出来的
J:Jelly
题意:
就是三维迷宫求最短路径
题解:
直接就是裸的bfs,但是还是贡献了一发wa,由于比较着急,导致没有考虑到不存在输出-1的情况,这个太不应该了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<map>
#include<list>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const ll maxn=100;
char mp[maxn+10][maxn+10][maxn+10];
int vis[maxn+10][maxn+10][maxn+10];
int n;
int dirx[7]={0,0,0,-1,1,0,0};
int diry[7]={0,0,0,0,0,1,-1};
int dirz[7]={0,1,-1,0,0,0,0};
int flag=0;
struct node{
int x,y,z;
int s;
node(int xx,int yy,int zz,int ss){
x=xx;
y=yy;
z=zz;
s=ss;
}
};
queue<node>q;
int check(int x,int y,int z){
if(x<1||x>n||y<1||y>n||z<1||z>n)
return 0;
else if(mp[x][y][z]=='*'||vis[x][y][z]==1)
return 0;
else
return 1;
}
void bfs(int x,int y,int z){
q.push(node(x,y,z,1));
vis[x][y][z]=1;
while(!q.empty()){
node now=q.front();
if(now.x==n&&now.y==n&&now.z==n){
cout<<now.s<<endl;
flag=1;
return ;
}
q.pop();
for(int i=1;i<=6;i++){
int fx=now.x+dirx[i];
int fy=now.y+diry[i];
int fz=now.z+dirz[i];
if(check(fx,fy,fz)){
q.push(node(fx,fy,fz,now.s+1));
vis[fx][fy][fz]=1;
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%s",mp[i][j]+1);
}
}
memset(vis,0,sizeof(vis));
bfs(1,1,1);
if(flag==0){
printf("-1\n");
}
return 0;
}
感觉八道题其实应该没问题的,这次还是比以前几次要稍微好一点了,至少不是全程崩溃
还有那么点波澜。。。