目录
题目链接的话就是题目哦,点击就行,是超链接!其次,这个题目的顺序是我做题以及补题的顺序,推荐就按这个顺序来,如果是dalao,当我没说!告辞!
K-Many Littles Make a Mickle
题意:
题目意思很言简意赅,聚沙成塔,每i层都会有i*i个房间,每一个房间都能容纳M个人,问N层的沙塔能够容纳多少人
做法:
真的签到!出题人真好!暴力模拟即可,数据范围也不大
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { int T,N,M; cin>>T; while(T--) { int sum=0; cin>>N>>M; for(int i=1;i<=N;i++) { sum+=i*i*M; } cout<<sum<<endl; } return 0; } /** 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 */
B-Continued Fraction
题意:
给定一个计算公式(做法里见),然后要求把这个式子得到的结果转换成公式的样子,并且把补上的数字由高到低,由左到右依次输出
做法:
咱先来推导一下第一个样例105/38
2*4+1=9 9*3+2=29 29*1+9=38 38*2+29=105
这样一个过程我们能很明显的看出,最后结果的分母分子和a数组里的数字的一些神奇的关系,这样咱就可以由结果慢慢的推导出每一个数组以及最开始的分母,中间的求解过程得稍微注意注意,特别是除数以及这个余数的交换得注意,第一发就是错在这里了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=110; int main() { int T,X,Y; vector<int> ans; cin>>T; while(T--) { ans.clear(); cin>>X>>Y; int tmp=X,flag=0; if(X==1) ans.push_back(0),ans.push_back(Y),flag=1; while(tmp!=1) { tmp=X%Y; ans.push_back((X-tmp)/Y); //cout<<((X-tmp)/Y)<<" "<<tmp<<" "<<Y<<" "<<X<<endl; X=Y,Y=tmp; } if(!flag) ans.push_back(X); cout<<ans.size()-1; for(int i=0;i<ans.size();i++) cout<<" "<<ans[i]; cout<<endl; } return 0; } /** x+1/y=(x*y+1)/y 2*4+1=9*3+2=29*1+9=38*2+29=105 (((A(n)*A(n-1)+1)*A(n-2)+A(n))*A(n-3))+(A(n)*A(n-1)+1)) A(n)*A(n-1)=F(n) */
L-It Rains Again
题意:
老天爷要下雨!你处于一个X-Y坐标轴上,雨水从Y轴从上往下来,这个坐标轴里存在一些挡雨板,他们的开头位置以及结尾位置都会给定,然后问你能躲雨的地方一共有多长?(区间和)且题目声明没有竖直方向的挡雨板。
做法:
做这题直观感觉,“这题好简单!但是我为什么WA了,我是fw?”比赛结束,看题解,挡雨板?!求错东西了!我确实是fw,QAQ!借用题目给的样例图
题目要求的其实就是黄色部分的总长度和,一个简简单单的前缀和就搞定了,我整了一下午。。。我个人感觉就是用前缀和做的话,一个点得注意就是区间长度这个,标记的时候x2不能标记到,否则会重复计算导致WA,因为我自己在码的时候连样例都没过去,所以个人感觉得注意点,有dalao说我是错的,那就是错的,dalao yyds
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+10; int main() { int n,a[maxn]; while(cin>>n) { memset(a,0,sizeof(a)); for(int i=1; i<=n; i++) { int x1,x2,y1,y2; cin>>x1>>y1>>x2>>y2; for(int i=x1; i<x2; i++) a[i]=1; } /*for(int i=1;i<=10;i++) cout<<a[i]<<" "; cout<<endl;*/ for(int i=1;i<=maxn;i++) { if(a[i]==1) a[i]=a[i-1]+a[i]; else a[i]=a[i-1]; } /*for(int i=1;i<=10;i++) cout<<a[i]<<" "; cout<<endl;*/ cout<<a[maxn]<<endl; } return 0; } /** 求总区间长度和 */
H-Hearthstone So Easy
题意:
两个人在玩炉石(虽然没玩过,但是看人玩过),然后两个人都没卡了,这意味着从现在开始他们两个人每抽一次卡都得扣除一定的疲劳值(也就是生命值),注意:疲劳值是递增的,初始值是0,然后依次+1。然后两个人的游戏过程分为两个过程:一个是抽卡过程,需要扣除疲劳值(也就是生命值);另一个则是对于对方的操作或者对自己的操作,可以扣除对方K的血量,也可以给自己增加K的血量(无上限)。问两个人最后谁能活着,成王败寇!谁活着谁胜利!
做法:
看了题解才明白这个博弈的三种结果,脑淤血系列,首先,每一回合的开始两个人的血量都是一样的,这是为啥呢?题目给定的(惊不惊喜,意不意外)就是每一回合两个人对应的操作都是一样的,就导致了两个人连扣出生命值都是同步的,因此每一回合开始,两人血量都是一样的,咱假设第i个回合P能打败F了,这说明第i-1个回合的时候P打败不了F;但是F对于P的操作比P对F的操作永远要快一回合,因为P无法打败F的话,P必然会被下一回合的疲劳值把生命值直接扣除到0及以下,所以只要P第一回合无法打败F,那么F就必定是胜利的。然后再来解答另外两种情况:1、P第一回合能直接打败F,或者P能把F的健康值直接扣除到1,那么F下一回合抽卡时就会因为疲劳值直接战败。2、P直接抽卡就被疲劳值扣除完了生命值,也就是n==1的情况,P连卡都抽不了,哪有怎么去打败F呢?
就是以上三种情况,这都是题解的功劳,QAQ,这次的比赛还是好拉啊,最近太久没码题目了,反应慢了真的好多,得好好静下心修炼了!
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=5e4+10; int main() { int n,k,t; cin>>t; while(t--) { cin>>n>>k; if(n==1) { cout<<"freesin"<<endl; } else if(n-k<=1) { cout<<"pllj"<<endl; } else { cout<<"freesin"<<endl; } } return 0; }