- chenshixian 的博客
陈室先的总结8.14day10
- @ 2024-8-20 20:15:20
题目传送门
T1小苹果
思路
每次可以拿走(n+2)/3个苹果,如果n%3==1那么n会被拿走
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("apple.in","r",stdin);
freopen("apple.out","w",stdout);
int n,i=0,c=0,l=1;
cin>>n;
while(n){
i++;
if(n%3==1&&l)c=i,l=0;
n=n-(n+2)/3;
}
cout<<i<<' '<<c;
return 0;
}
T2公路
思路
每次找到比当前加油站便宜的加油站,如果没有开到终点
代码
#include<bits/stdc++.h>
using namespace std;
long long n,d,w[111111],a[111111],q=0,s=0,wz=1;
int main(){
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
cin>>n>>d;
for(long long i=1;i<n;i++)cin>>w[i];
for(long long i=1;i<=n;i++)cin>>a[i];
long long i=1;
while(i<n){
long long qs=0,us=i;
for(long long j=i+1;j<=n;j++){
qs+=w[j-1];
if(a[i]>a[j]){
us=j;
break;
}
// cout<<us<<"\n";
}
if(us==i){
us=n;
}
qs-=s;
long long k=(qs+d-1)/d;
s=(k*d)-qs;
q=q+(k)*a[i];
i=us;
// cout<<q<<' '<<us<<' '<<k<<' '<<s<<' '<<i<<"\n";
}
cout<<q;
return 0;
}
错误与感想
处理不当,导致RE,以后要认真检查代码,防止类似情况发生
T3一元二次方程
思路
按题目的要求写就行了,只是要注意细节
代码
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
if(!b)return a;
return gcd(b,a%b);
}
int main(){
freopen("uqe.in","r",stdin);
freopen("uqe.out","w",stdout);
int t,m;
cin>>t>>m;
while(t--){
int a,b,c;
cin>>a>>b>>c;
if(a<0)a*=-1,b*=-1,c*=-1;
int cc=b*b;
int jj=4*a*c;
int d=cc-jj;
// return 0;
if(d<0)cout<<"NO\n";
else{
if(d==0){
int x=(-b)/(2*a);
if((abs(b))%(2*a)==0)cout<<x<<"\n";
else{
int g=gcd(abs(b),(2*a));
if((-b/g)%(2*a/g)==0)cout<<(-b/g)/(2*a/g);
else cout<<(-b/g)<<'/'<<(2*a/g);
cout<<"\n";
}
}
else{
if(int(sqrt(d))*int(sqrt(d))==d){
int t=sqrt(d)-b;
if(t==0)cout<<0<<"\n";
else if((abs(t)%(2*a))==0)cout<<t/(2*a)<<"\n";
else{
int g=gcd(abs(t),(2*a));
cout<<t/g<<'/'<<(2*a/g);
cout<<"\n";
}
}
else{
int k, r;
for (int i = sqrt(d); i >= 1; i--){
if (d % (i*i) == 0){
k = i;
r = d / (i*i);
break;
}
}
if(b==0){
int g=gcd(abs(k),(2*a));
int b1=r;
int b2=(2*a)/g;
if(k/g%b2==0){
if(k/g/b2!=1)cout<<k/g/b2<<'*';
}
else if(k/g!=1)cout<<k/g<<'*';
if(b1!=1)cout<<"sqrt("<<r<<')';
if(b2!=1&&k/g%b2!=0)cout<<'/'<<(2*a)/g;
cout<<"\n";
}
else{
int g=gcd(abs(b),(2*a));
if((2*a/g)>0){
if((-b/g)%(2*a/g)==0)cout<<(-b/g)/(2*a/g)<<"+";
else cout<<(-b/g)<<'/'<<(2*a/g)<<"+";
}
else cout<<(-b/g)<<'/'<<(2*a/g)<<"+";
g=gcd(abs(k),(2*a));
int b1=r;
int b2=(2*a)/g;
if(k/g%b2==0){
if(k/g/b2!=1)cout<<k/g/b2<<'*';
}
else if(k/g!=1)cout<<k/g<<'*';
if(b1!=1)cout<<"sqrt("<<r<<')';
if(b2!=1&&k/g%b2!=0)cout<<'/'<<(2*a)/g;
cout<<"\n";
}
}
}
}
}
return 0;
}
错误与感想
骗分的,以后模拟题要多多思考