2022 杭电第四场
2022 杭电第四场
1004 Link with Equilateral Triangle
题意:
一个边长为n的正三角形由个边长为1的小三角形组成,小三角形的三个顶点都填入0,1,2。其中大三角形的左边不能为0,右边不能为1,底边不能为2。另外小三角形三个顶点填的数之和不能为三的倍数。问能不能填的符合要求。
思路:
签到题,看着大家过的都快,忙猜一手输出全为No。
官方证明:对于一个合法的解,应当满足不存在同时包含0,1,2的三角形,下面我们证明这样的三角形一定存在。
左下角必然是1,右下角必然是0,底边不能含有2,则底边上必然有奇数条1-0的边,这些边都属于一个小三角形。考虑其他的0-1边,由于不在两个斜边上,其他的0-1边必然属于两个三角形。因此“每个三角形内0-1边的数量”的和必然为奇数。
但是,假设不存在0-1-2的三角形,则所有三角形都必然包含0条或2条的0-1边,产生了矛盾。
因此一定存在0-1-2的三角形。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline void solve(){
int n;
cin>>n;
cout<<"No"<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
1006 BIT Subway
题意:
累加购买车票分区间优惠不同,小于100无优惠,大于等于100小于200打八折,大于200打五折。Dlee认为一张票可以分段购买,输出Dlee认为的票价和实际的票价。
思路:
分段函数,按题意模拟即可
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100005;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
double a,x=0,y=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lf",&a);
if(x<100){
if(x+a<100)
x+=a;
else if(100+0.8*(a-100+x)<200)
x+=(100-x)+0.8*(a-100+x);
else
x+=100-x+100+(a-225+x)*0.5;
}else if(x<200){
if(x+0.8*a<200){
x+=0.8*a;
}else{
x+=(200-x)+0.5*(a-(200-x)/0.8);
}
}else{
x+=0.5*a;
}
if(y<100) y+=a;
else if(y>=100&&y<200) y+=a*0.8;
else y+=a*0.5;
}
printf("%.3lf %.3lf\n",x,y);
}
return 0;
}