第4题
有一个大的等边三角形,边长n.大三角形由n^2具有边长的小等边三角形1.链接将使用以下限制将数字填充到小三角形的每个顶点中:填写的数字应为0,1或2.·大三角形的左侧不应填充0.大三角形的右侧不应填充1.大三角形的底边不应填充2.·对于每个具有边长的小三角形1,三个顶点之和不应是3.当林克试图这样做时,他发疯了,因为他找不到任何满足上述所有条件的三角形。现在,他向你寻求帮助。请告诉Link:是否可以填充三角形以使其满足上述所有条件?
这道题目卡了我们很久,一直希望可以找出几个样例来找规律,然后我们就尝试了n=3,4,5,6.但都是找不出符合要求的图形。后面才想到,有没有一种可能,这种图形压根就不存在,所以抱着试试看的想法我们居然过了,确实离谱。原本以为是找规律题,原来他压根就不存在。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int main(){
cin>>n;
for (int i=1;i<=n;i++){
cin>>m;
cout<<"No"<<endl;
}
return 0;
}
非常简单的代码,算是一道签到题了,不过我们找规律浪费了好长时间。
第6题
BIT(北京国际交通)地铁可以在短时间内将人们带到任何地方,是2050年最受欢迎的出行方式。有一天,BIT地铁推出如下促销活动:
- 如果总票价x您本月花费的金额大于或等于100,并且您用¥购买了另一张机票y,那么你只需要支付¥0.8年.
- 如果总票价x您本月花费的金额大于或等于 200,并且您用 ¥ 购买了另一张机票y,那么你只需要支付¥0.5年.
DLee非常高兴,他可以攒更多的钱买房子。然而,很久以后,他注意到真正的计费方式与他想象的有点不同。例如,DLee本月花了199日元买了票,他现在买了一张10日元的票,然后买了一张8元的票:
- DLee认为他一次只能买一部分票,而不是整张票。也就是说,对于10日元的门票,DLee认为他可以先买到1.25日元的部分门票,然后再买8.75日元的部分门票。在他的误解下,他需要花钱199+1.25*0.8+8.75*0.5+8*0.5=¥208.375.请注意,在此示例中,DLee必须花费¥1.25,而不仅仅是¥1才能制作x=200.
- 真正的计费方式是,只有你花了足够的钱,你才能得到折扣,所以它会199+10∗0.8+8∗0.5=¥211元.
现在DLee想知道在之前的几个月里,计费方式有多大的区别。
也是一道模拟题,对着题意写就好了,不过过程还是比较复杂的,需要小心考虑。
#include<bits/stdc++.h>
using namespace std;
double a[100010];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
double ans=0;
for(int i=1;i<=n;i++){
scanf("%lf",&a[i]);
}
double res=0;
for(int i=1;i<=n;i++){
if(res>=200) res+=a[i]*0.5;
else if(res>=100) res+=a[i]*0.8;
else res+=a[i];
}
for(int i=1;i<=n;i++){
if(ans<100){
if(ans+a[i]<100) ans+=a[i];
else{
double cnt=100-ans;
ans+=cnt;
// double x=a[i]-cnt;
a[i]-=cnt;
if(ans+a[i]*0.8>=200){
double cnt=200-ans;
ans+=cnt;
// double m=x-cnt/0.8;
a[i]-=cnt/0.8;
ans+=a[i]*0.5;
}
else {
ans+=a[i]*0.8;
}
}
}
else if(ans>=100&&ans<200){
if(a[i]*0.8<200-ans) ans+=a[i]*0.8;
else{
double cnt=200-ans;
ans+=cnt;
//double x=a[i]-cnt/0.8;
a[i]-=cnt/0.8;
ans+=a[i]*0.5;
}
}
else {
ans+=a[i]*0.5;
}
}
printf("%.3lf %.3lf\n",ans,res);
}
}
第7题
DLee进入了一个新的水平。等待他的是一座高楼大厦nn楼层,每个楼梯上都有一个怪物,我我-其中有生命值a_i.
DLee从地面(可视为0楼)开始,有一个基地攻击点a_0a0.他可以选择跳跃1,2点,k1,2,...,k地板向上或步行1地板向下,但他不能去怪物的生命值严格大于他的攻击点的楼层,也不能去去过的楼层。一旦他来打败一个怪物,他可以吸收他的生命值,并将其添加到他的攻击点。
请注意,DLee应始终在地板上{0,1,2,3,\dots,n}0,1,2,3,...,n.
现在DLee问你是否有可能打败所有的怪物并通过关卡。
就是询问有没有在大于所处位置的数字,并且可以保障访问每一个位置,难度确实存在,我们最开始用的是贪心,然后就一直wa,之后我们又试了模拟搜索,但也是wa了。
后面看题解才知道是后缀和以及二分答案,但比赛的时候确实没往这方面思考。
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define PII pair<int, int>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int sum[N];
int now;
bool check(int mid, int pos) {
if (sum[pos + 1] - sum[mid + 1] + now >= a[pos])
return 0;
else
return 1;
}
void solve() {
int n, k;
cin >> n >> now >> k;
for (int i = 1; i <= n + 10; i++)
sum[i] = 0;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = n; i >= 1; i--) //后缀
sum[i] = sum[i + 1] + a[i];
int maxx = 0, pre = 1;
for (int i = 1; i <= n; i++) {
int l = i + 1, r = n + 1;
while (l < r) {
int mid = l + r >> 1;
if (check(mid, i))
l = mid + 1;
else
r = mid;
}
// cout << l << endl;
if (now >= a[i])
l = i;
if (l >= min(pre + k, n + 1)) { //大于k
cout << "NO" << endl;
return;
}
maxx = max(maxx, l);
if (l >= maxx && l == i) {
now += sum[pre] - sum[maxx + 1];
pre = i + 1;
maxx = 0;
}
}
cout << "YES" << endl;
}
signed main() {
int T = 1;
cin >> T;
while (T--)
solve();
return 0;
}