有关最近的几场比赛
最近每天都会打比赛...简直打到自闭好吗.....
欣赏一下我的新春对联:
上联:不论如何简单反正不对
下联:别提有多困难统统不会
横批:要废
呜呜呜呜自闭xrq在线哭泣
比赛前
xfy:今天的比赛有点难 大家决定一下打不打
xrq:打!(勇者无惧心想着能水几道是几道)
比赛中
xrq:我第一道就不会
xrq:我废了啊啊啊啊啊
ydy:让我看看有没有暴力水过去的
xrq:没有别想了
比赛后
xfy:此时一只莽夫失去了他的梦想
xrq:....是我贸然了
xfy:还打不打?
xrq:打!!(不就一场难赛是阻挡不了我的脚步的)
第二天的比赛中
xrq:我废了。
言归正传。
Day1 1月17日
这一天的题是真的难
我连交都没交
不仅没交还趁着机会和男神交流了感情
(╬ ̄皿 ̄)=○#( ̄#)3 ̄)
我不敢了不敢了
因为啥都没写出来也懒得看通过代码这天分析就莫得了...
Day2 1月18日
今天(据说)比较简单
然后我看着第一题陷入了沉思...
中垂线解析式咋求来着?
(初中数学都忘了我果不其然要废)
最后还是求助了度娘用数学公式死带出来了
度娘万岁!
A Audio
题目描述
Nancy很喜欢音乐。
她能同时分辨出三种不同的音乐。恰巧,一座城市中有三处同时有交响音乐会(音源响度相同)。但是Nancy每一场都不想错过,于是她想寻找一个地点,使得三处音乐会声音的响度相同,这样她就可以同时欣赏三场音乐会啦!
(注:假设声音传播过程中不会受障碍物作用,声音传播满足平方反比定律)输入描述:
共三行:每行两个整数xix_ixi与yiy_iyi,三点不共线。
数据满足:0≤∣xi∣,∣yi∣≤109输出描述:
共一行:两个实数posx,posy,表示Nancy欣赏音乐会的地点(保留三位小数)
输入
0 0 1 3 4 2输出
2.000 1.000
这一看就是一个很简单的数学题...找三角形的的重心嘛
先求出两个中垂线的解析式再求其焦点...
百度得到中垂线解析式为:
y=-x/k+(x1+x2)/2k+(y1+y2)/2
还得先求线段解析式...
那么线段解析式
k1=(y1-y2)/(x1-x2)
带入就可以求出中垂线的
k2=-1/k1,b=(x1+x2)/2k+(y1+y2)/2
就这样求出来俩求交点
代码:
#include<cmath> #include<cstdio> #include<string> #include<utility> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int main() { int x1,x2,x3,y1,y2,y3; double k1,k2,b1,b2,k3,k4,b3,b4,ans,ansy; scanf("%d%d",&x1,&y1); scanf("%d%d",&x2,&y2); scanf("%d%d",&x3,&y3); k1=((y1-y2)*1.0)/(x1-x2); k3=-(1/k1),b3=(x1+x2)/(2.0*k1)+((y1+y2)*1.0)/2.0; k2=((y2-y3)*1.0)/(x2-x3); k4=-(1/k2),b4=(x2+x3)/(2.0*k2)+((y2+y3)*1.0)/2.0; ans=(b4-b3)/(k3-k4); ansy=ans*k3+b3; printf("%.3lf %.3lf",ans,ansy); return 0; }
不过ydy大佬用万能搜索直接找见了(这里)....就我个傻子还推了半天
B Bits
题目描述
Nancy喜欢做游戏!
汉诺塔是一个神奇的游戏,神奇在哪里呢?
给出3根柱子,最开始时n个盘子按照大小被置于最左的柱子。如果盘子数为偶数,则需要将她们全部移动到最右侧的柱子上,否则将她们移动到中间的柱子上。那么,Nancy该怎样移动呢?请你输出汉诺塔游戏的过程叭!输入描述:
共一行:一个整数n,表示最开始n个盘子(编号为1到n)的放置方法。
数据满足:2≤n≤11输出描述:
共2n组:每组n+2行,每行3×(2n+1)+4个字符,用.表示空白区域,用|表示柱子区域,用*表示盘子。组与组之间请输出3×(2n+1)+4个-。
具体输出方式请参看样例进行理解。输入
2输出
................... ...|.....|.....|... ..***....|.....|... .*****...|.....|... ------------------- ................... ...|.....|.....|... ...|.....|.....|... .*****..***....|... ------------------- ................... ...|.....|.....|... ...|.....|.....|... ...|....***..*****. ------------------- ................... ...|.....|.....|... ...|.....|....***.. ...|.....|...*****.
这道题当时就没看....
仔细一看,当时的决定真正确(ー`´ー)
好麻烦...写出来的都是勇士....
其实题不难,难的是如何把汉诺塔用点点表现出来
但我也懒得写了
随便粘了一个大佬的
#define debug 0 #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; const int N = 1e6 + 5, M = 20010905; const db eps = 1e-8; typedef vector<ll> vi; typedef vector<vi> vii; void solve(); void print(){cout<<'\n';}template<class T,class ...U>void print(T x, U ...y){cout<<x<<' ';print(y...);} int main() { ios::sync_with_stdio(0); cin.tie(0); cout << setprecision(2) << fixed; if(debug){freopen("main.cpp","r",stdin);string x;cin>>x;} solve(); } // int stk[3][20], tp[3], n, m; char p[1000][1000], sl[1000]; bool flg; void line(int i, int j, int len, char c) { while (len--) p[i][j++] = c; } int get(int i) { return 2 * (n + 1) * i + n + 1; } void clear() { for (int i = 1; i <= n + 1; i++) { for (int j = 0; j < m; j++) { p[i][j] = '.'; } } for (int i = 0; i < 3; i++) { for (int j = 1; j <= n + 1; j++) { p[j][get(i)] = '|'; } } } void draw() { if (flg) cout << sl << '\n'; flg = 1; clear(); for (int i = 0; i < 3; i++) { int t = n + 1; for (int j = 0; j < tp[i]; j++) { line(t--, get(i) - stk[i][j], 2 * stk[i][j] + 1, '*'); } } for (int i = 0; i <= n + 1; i++) { cout << p[i] << '\n'; } } void dfs(int u, int v, int s) { if (s == 1) { stk[v][tp[v]++] = stk[u][--tp[u]]; draw(); return; } int t; for (int i = 0; i < 3; i++) if (i != u && i != v) t = i; dfs(u, t, s - 1); stk[v][tp[v]++] = stk[u][--tp[u]]; draw(); dfs(t, v, s - 1); } void solve() { cin >> n; m = 3 * (2 * n + 1) + 4; for (int i = 0; i < n; i++) { stk[0][tp[0]++] = n - i; } line(0, 0, m, '.'); for (int i = 0; i < m; i++) sl[i] = '-'; draw(); if (n & 1) dfs(0, 1, n); else dfs(0, 2, n); }
C Channels
题目描述
Nancy喜欢学习,也喜欢看电视。
为了想了解她能看多长时间的节目,不妨假设节目从时刻1开始,一直播放到时刻6×10100。每个节目持续50个时刻,节目与节目间会有10个时刻的广告时间。
然而,Nancy实在是太忙了,她从t1时刻开始观看,观看至t2时刻,请你帮忙计算她有多少个时刻能欣赏到电视节目。输入描述:
若干行:每行两个整数t1与t2。
数据满足:1≤t1≤t2≤1018输出描述:
若干行:每行一个整数,表示能品味电视节目的时刻数。示例1
输入
1 61输出
51示例2
输入
116969978 507978500 180480072 791550396 139567120 655243745 1470545 167613747 57644034 176077476 44676 56984808 215706822 369042088 108368065 320914746输出
325840433 509225275 429730516 138452673 98694536 47450113 127779387 177122232
就是这道题!卡了我整整半小时!还没做出来!
不知道为什么反正不对
(可能是做法问题)
其实这道题很简单
就是普通的加减法 题目都不用咋理解....
(应该不会有人不知道周期咋求吧)
改了并通过的代码:
#include<cmath> #include<cstdio> #include<string> #include<utility> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef unsigned long long ull; int main() { ull t1,t2,s1,s2,j1,j2,ans1,ans2; while(cin>>t1>>t2)//虽然我不喜欢用cin但那个评测机在这用scanf就会结束不了不知道为啥 { t1-=1;//这里是因为第一分钟也算在内 考试时我就因为这个老是不对 s1=t1/60; j1=t1%60; ans1=s1*50; if(j1>50) ans1+=50; else ans1+=j1; s2=t2/60; j2=t2%60; ans2=s2*50; if(j2>50) ans2+=50; else ans2+=j2; printf("%lld\n",ans2-ans1); } return 0; }
D DDoS
题目描述
Nancy的男朋友喜欢网络安全!
最近,一种新的DDoS——脉冲波悄然来临。其基本原理是利用不同线路服务器的延时,使得Request同时到达目标服务器,以堵塞其它正常的通讯。
不妨假设攻击者在1号节点,目标服务器在n号节点,其余节点(2到n-1号节点)为中继服务器。
攻击者可以在任意时间发送一个定向数据包(即规定其经过中继服务器的路线,但不同数据包的路线不能完全相同),目标服务器对这种数据包具有100%的识别率,一旦识别到这种数据包,则会屏蔽这一时刻后的所有数据包。
Nancy好奇,攻击者在最优策略下,目标服务器能够收到多少份数据包呢?输入描述:
第一行:两个整数n,m。
接下来m行:每行三个整数x,y,z,表示节点x与y可以单向通信(x到y),耗时为z。
数据满足:3≤n≤100000,1≤m≤200000,0≤z≤⌊10πe⌋,图为拓扑图(有向无环图)。输出描述:
共一行:表示攻击者在最优策略下,目标服务器能够收到数据包的数量。由于数量可能会很大,你只需要输出答案对20010905取模后的值。输入
4 4 1 2 3 1 3 1 2 4 1 3 4 3输出
2说明
显然,攻击者在0时刻发送两个定向数据包(1-2-4和1-3-4),它们同时在第4时刻到达目标服务器。
又是一道当时不带了看的题...
看见图就头疼www
依旧是dalao代码
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<vector> #include<queue> #include<cmath> #include<map> #include<set> #define ll long long #define F(i,a,b) for(int i=(a);i<=(b);i++) #define mst(a,b) memset((a),(b),sizeof(a)) #define PII pair<int,int> using namespace std; template<class T>inline void read(T &x) { x=0; int ch=getchar(),f=0; while(ch<'0'||ch>'9'){if (ch=='-') f=1;ch=getchar();} while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} if(f)x=-x; } const int inf=0x3f3f3f3f; const int maxn=200500; const ll p=20010905; ll n,m,vis[maxn]; ll head[maxn],num; ll f[maxn]; struct node{ ll v,w,nex; }e[maxn]; void add(ll u,ll v,ll w) { e[++num].nex=head[u]; e[num].v=v;e[num].w=w; head[u]=num; } ll dfs(int u) { if(f[u]) return f[u]; ll temp=0; for(int i=head[u];i;i=e[i].nex) { int v=e[i].v; temp=(temp+dfs(v))%p; } f[u]=temp; return f[u]; } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { ll x,y,z; read(x),read(y),read(z); add(y,x,z); } f[1]=1; ll ans=dfs(n); cout<<ans<<endl; return 0; }
好下一道
E Exams
题目描述
Nancy是老师的小帮手!
众所周知,大学的学分绩点十分难以计算 。
一门课程,有必修、限选、任选之分,而其成绩,又由平时成绩、期中考试、期末考试之分,最后还要对总分数进行四舍五入。
具体的,一名同学的学分绩点是这样计算的:
下面你知道了Nancy的成绩单,请你计算其最终学分绩点。
- 计算且仅计算必修和限选课程
- 根据平时成绩、期中成绩、期末成绩对应的不同比例求和,并四舍五入到整数
- 学分绩点为各门课成绩乘以学分占总学分的比例
- 对计算结果进行四舍五入(保留两位小数)
输入描述:
第一行:一个整数n,表示Nancy本学期修读了n门课程
接下来n行:每行一个整数和七个实数,表示课程性质(0为必修,1为限选,2为任选),学分,平时成绩及其比例,期中考试及其比例,期末考试及其比例,保证比例之和为1,且实数最多有一位小数。
数据满足1≤n≤64,课程性质∈{0,1,2},学分∈[1,16],成绩∈[0,100],比例∈[0,1],数据保证至少有一门必修或限选课。输出描述:
共一行:表示Nancy的学分绩点。输入
5 0 1 97 1 0 0 0 0 0 2.5 98 0.3 0 0 92 0.7 0 4 100 0.3 0 0 100 0.7 0 1 0 0 0 0 74 1 0 2 94 1 0 0 0 0输出
94.67
啊终于来了道极其简单我写出来的啦
如上文所述,真的很简单,就是小学应用题哈哈哈哈
代码
#include<cmath> #include<cstdio> #include<string> #include<utility> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct mac { int chengji; double xuefen; }a[100]; int main() { int n,k; double pi,qi,mo,b1,b2,b3,zong=0,ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%lf%lf%lf%lf%lf%lf%lf",&k,&a[i].xuefen,&pi,&b1,&qi,&b2,&mo,&b3); if(k==2) { i--,n--; continue; } pi=pi*b1+qi*b2+mo*b3; a[i].chengji=round(pi); zong+=a[i].xuefen; } for(int i=1;i<=n;i++) { ans+=(a[i].chengji*1.0)*(a[i].xuefen/zong); } printf("%.2lf",ans); return 0; }
F Fool Problem
题目描述
Nancy喜欢斐波那契数列!若f0=0,f1=1,f2=1,请求:fn+1fn−1−fn2(n≥2),其中fi表示斐波那契数列第i项。输入描述:
共一行:一个整数n。
数据满足:2≤n≤102020。输出描述:
共一行:表示表达式的值。输入
2输出
1
其实是道好做好猜的题
我是推了一下,其实也可以试几个就知道了
(开始读入没注意一直过不了多亏ydy大佬帮助)
其实比赛时的代码是有点问题的现在做了修改(n=3时不符合单数-1的规律)
(这其实可以算作ydy的代码)
#include<cmath> #include<cstdio> #include<string> #include<utility> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a[10000]; int main() { char c; int i=0; while((c=getchar())!='\n') { a[++i]=c; } if(int(a[i]-'0')%2&&a[i]-'0'!=3) cout<<-1; else cout<<1; return 0; }
G Game
题目描述
Nancy喜欢博弈!
Johnson和Nancy得到了一个神奇的多重集合,仅包含一个正整数n,两个人轮流进行操作。
一次操作可以将集合中一个数字分解为它的任意两个非1的因数,并加入集合中。
他们想知道,在Johnson和Nancy绝顶聪明的情况下,如果Nancy先手进行操作,最后谁没有办法继续操作了呢?输入描述:
第一行:一个整数n。
数据满足:1≤n≤95718。输出描述:
共一行:一个字符串,表示最后谁(Johnson或者Nancy)无法进行操作。输入
4输出
Johnson
拆解质因数 很简单的题
我前面有篇博客约数之和写了这个,但是比赛时出了问题
我自我检讨 我是直接粘贴的不知道为什么错 现在发现了 必须得保证除数不等于被除数
还是感谢ydy 自己还在鼓捣E来帮我
#include<cmath> #include<cstdio> #include<string> #include<utility> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int main() { int m=0,n; scanf("%d",&n);for(int i=2;i<n;i++) { while(n!=i) { if(n%i==0) { m++; n=n/i; } else break; } } if(m%2) printf("Johnson"); else printf("Nancy"); return 0; }
再次360度鞠躬感谢ydy大佬
H ”Happy New Year!“
题目描述
新年快乐!输入描述:
无输出描述:
请输出本题题目(含引号)。
....
话说开始这道题出了点问题一直过不了
不过后来修好了错的那几次不算罚时了真贴心哈哈哈
include<cmath> #include<cstdio> #include<string> #include<utility> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int main() { printf("”Happy New Year!“"); return 0; }
I I love you
题目描述
此时相望不相闻,愿逐月华流照君。一纸情书,到底蕴含了多少倍的爱情呢?
I love you, not only for what you are, but for what I am when I am with you.输入描述:
共一行:一封若干个字符的情书(大小写不敏感)。
情书不会超过684594个字符(大写、小写字母)。输出描述:
共一行:包含一个整数,即iloveyou在情书中作为子序列出现的次数。
由于答案可能很大,请输出对20010905取模后的值。输入
IloveyouNotonlyforwhatyouareButforwhatIamWhenIamwithyouIloveyouNotonlyforwhatYouhavemadeofyourselfButforwhatYouaremakingofme输出
2864
妈耶这道题...真的不是出题人在表白嘛......20010905怎么看都是生日啊喂!
我向来对字符串和图不感冒....看见就烦....
但这题其实很简单只是当时一看就不想做
还是大佬代码
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 20010905; const ll N = 1e6 + 5; ll dp[N]; char s[N]; int main() { ios::sync_with_stdio(false); cin >> s; for (int i = 0; s[i]; i++) { if (s[i] == 'i' || s[i] == 'I') dp[0] = (dp[0] + 1) % mod; else if (s[i] == 'l' || s[i] == 'L') dp[1] = (dp[1] + dp[0]) % mod; else if (s[i] == 'o' || s[i] == 'O') { dp[2] = (dp[2] + dp[1]) % mod; dp[6] = (dp[6] + dp[5]) % mod; } else if (s[i] == 'v' || s[i] == 'V') dp[3] = (dp[3] + dp[2]) % mod; else if (s[i] == 'e' || s[i] == 'E') dp[4] = (dp[4] + dp[3]) % mod; else if (s[i] == 'y' || s[i] == 'Y') dp[5] = (dp[5] + dp[4]) % mod; else if (s[i] == 'u' || s[i] == 'U') dp[7] = (dp[7] + dp[6]) % mod; } cout << dp[7] << '\n'; return 0; }
好了下一个(~ ̄▽ ̄)~
J Jelly
题目描述
Nancy喜欢吃果冻!
Nancy钻进了一个n×n×n的果冻里,她想从(1,1,1)一路上、下、左、右、前、后六个方向吃到(n,n,n)。但果冻毕竟是有许多口味的,标记为*的口味是Nancy不愿意吃的,其余的果冻均标记为.。Nancy不想吃坏肚子,于是她想尽可能少的吃果冻。
下面给出果冻的情况,请你帮忙计算一下她能吃多少块果冻叭!输入描述:
第一行:一个整数n。
接下来n层,每组n行,每行n列,表示果冻(i,j,k)的情况(如题目描述所述)。
数据满足:1≤n≤100,保证果冻(1,1,1)不是Nancy不愿意吃的。输出描述:
如果可以到达(n,n,n),请输出路上吃的果冻数量,否则请输出-1。输入
2 .* .. *. ..输出
4
终于最后一道啦~
看上去是个好想法....我也想钻进果冻里!
三维搜索题,依旧没写
#include <bits/stdc++.h> using namespace std; const int maxn = 105; struct node{int i, j, k, val;}; int n; int di[] = {-1, 1, 0, 0, 0, 0}; int dj[] = {0, 0, -1, 1, 0, 0}; int dk[] = {0, 0, 0, 0, -1, 1}; char s[maxn][maxn][maxn]; queue<node> q; void bfs() { int ans = 0; s[1][1][1] = 0; q.push(node{1, 1, 1, 1}); while(!q.empty()) { node u = q.front(); q.pop(); if(u.i == n && u.j == n && u.k == n) { printf("%d", u.val); return; } for(int i = 0; i < 6; i++) if(s[u.i+di[i]][u.j+dj[i]][u.k+dk[i]] == '.'){ s[u.i+di[i]][u.j+dj[i]][u.k+dk[i]] = 0; q.push(node{u.i+di[i], u.j+dj[i], u.k+dk[i], u.val+1}); } } printf("-1"); return; } int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) scanf("%s", s[i][j]+1); bfs(); return 0; }
今天就到这里吧~
话说今天比赛5个小时我只做了2个半小时的题...
学测还没写啊啊啊啊啊
zxp学长我对不起你...(真心忏悔)
溜了溜了
“天地生人,有一人,当有一人之业;
人生在世,生一日,当尽一人之勤。”
——话剧《立秋》