题意:水题
#include<bits/stdc++.h>
using namespace std;
int main(){
int s1,s2,t1,t2;
cin >>s1>>t1>>s2>>t2;
int L = s2 - s1;//红绿灯之间距离
double t;
t = max(s1 *1.0/ t1,L*1.0 / t2);
printf("%.6lf\n",t);
return 0;
}
B. 命中注定
题意:就是判断是否能相交,分情况考虑就行了
1.AB,CD均与X轴垂直,不可能遇到,输出“NO”;
2.A,C在同一个点,那么答案就是这个点的坐标;
3.AB,CD均与X轴平行,因为A,C点的纵坐标是相同,所以A,B,C,D在一条横线上,只需要考虑方向就好,即只有在横线上 A->B D<-C这样排列的时候才有解,交点位置为((xa+xc)/2,ya)。其他情况均无解,直接输出“NO”。
4.AB,CD均存在斜率,两条直线必定存在交点,只需要判断这个交点是否在AB和CD的射线上即可,我们可以通过向量来判断。如果在两条射线上,直接输出交点坐标;其他情况均无解,直接输出“NO”。
#include <bits/stdc++.h>
using namespace std;
struct node{
int x,y;
}eg[4];
void solve(){
if(eg[0].x==eg[2].x&&eg[0].y==eg[2].y){
printf("%.2f %.2f\n",(double)eg[0].x,(double)eg[0].y);
return;
}
if(eg[0].x==eg[1].x){
printf("NO\n");
return ;
}
if(eg[0].y==eg[1].y){
int a=eg[1].x-eg[0].x;
int b=eg[3].x-eg[2].x;
if((a>0&&b<0&&eg[0].x<eg[2].x)||(a<0&&b>0&&eg[0].x>eg[2].x)){
printf("%.2f %.2f\n",(eg[0].x+eg[2].x)/2.0,(double)eg[0].y);
return ;
}
printf("NO\n");
return;
}
double k1=(eg[1].y-eg[0].y+0.0)/(eg[1].x-eg[0].x+0.0);
double b1=eg[1].y-k1*eg[1].x;
double k2=(eg[3].y-eg[2].y+0.0)/(eg[3].x-eg[2].x+0.0);
double b2=eg[3].y-k2*eg[3].x;
double x=(b2-b1+0.0)/(k1-k2);
double y=k1*x+b1;
int a=y-eg[0].y,b=y-eg[2].y;
if((a>0&&b>0)){
printf("%.2f %.2f\n",x,y);
return ;
}
printf("NO\n");
}
int main(){
for(int i=0;i<4;i++){
scanf("%d%d",&eg[i].x,&eg[i].y);
}
solve();
return 0;
}
题意:就是搞清他怎么输出字符串的就行了
思路:俺不想解释这个了,烦死,调试了半天;
#include<bits/stdc++.h>
#define maxn 10000
using namespace std;
int a[maxn];
char b[3] = {'l','x','d'};
stack<char> st;
int flag;
int tran;
void init(){
a[1] = 3;
a[2] = 9;
a[3] = 18;
a[4] = 30;
a[5] = 45;
a[6] = 63;
a[7] = 84;
a[8] = 108;
a[9] = 135;
a[10] = 165;
a[11] = 198;
a[12] = 234;
a[13] = 273;
a[14] = 315;
a[15] = 360;
a[16] = 408;
a[17] = 459;
a[18] = 513;
a[19] = 570;
a[20] = 630;
a[21] = 693;
a[22] = 759;
a[23] = 828;
a[24] = 900;
a[25] = 975;
a[26]=1053;
}
int main(){
init();
int n;
cin>>n;
if(n == 1){
cout<<'d'<<endl;
}
else if(n == 2){
cout<<"xd"<<endl;
}
else if(n == 3){
cout<<"lxd"<<endl;
}
else
{
for(int i=1;i<=25;i++){
if(n > a[i] && a[i+1] >= n)
flag = i;
}
//cout<<flag<<endl;
//本段意思把能完整输出的一部分序列先输出
for(int k = 1;k <= flag;k++){//每个字符要打印的次数
for(int j = 0;j <=2; j++)
{
tran = k;
while(tran--)
{
cout<<b[j];
}
}
}
int num = n - a[flag];
// cout<<num<<flag<<endl;
for(int j=2;j>=0;j--)
{
tran=flag+1;
while(tran--)
{
if(num)
{
st.push(b[j]);
num--;
}
else
break;
}
if(num==0)
break;
}
while(!st.empty())
{
cout<<st.top();
st.pop();
}
cout<<endl;
}
//一共还需要打印多少个字符
// int now = flag + 1;//现在每个字符要打印的次数
// int num = n - a[flag];
// for(int s = num;s > 0; s--){
// for(int j = 0;j<=2;j++)
// while(now--){
// st.push(b[j]);
// }
// }
// while(!st.empty())
// {
// // 打印栈顶元素,打印出:4 50 36 23 19 3
// cout << st.top() << endl;
// // 出栈
// st.pop();
// }
return 0;
}
让我们来看下大佬的题解:因为题面上说的是输出若干个lxd组成的字符串,所以我们每次输出一个完整的lxd,一直输出到最后一个lxd,如果最后一个lxd不能完整输出,特判一下每个字符应该输出多少个就行了。
俺没看懂哭了
#include<bits/stdc++.h>
using namespace std;
int n;
int a[5];
char b[5]="lxd";
int main()
{
while(~scanf("%d",&n)){
memset(a,0,sizeof(a));
int flag=0;
int num=0;
while(n>0){
int loc=3;
num++;
memset(a,0,sizeof(a));
while(loc&&n>0){
a[--loc]=num<n?num:n;
n-=num;
}
for(int i=0; i<3; i++){
if(a[i])for(int j=0; j<a[i]; j++)
printf("%c",b[i]);
}
}
printf("\n");
}
return 0;
}
题意:就是从一个序列中选择个最短区间使得和与输入的数最接近就行了。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int a[1000100];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
int sum=0,tt=inf;
int d=0,minn=inf,ww,ttt=0;
for(int i=0; i<n; i++)
{
sum+=a[i];
d++;
ww=abs(sum-m);
if(ww<=tt)
{
if(tt==ww)
minn=min(minn,d);
else
{
tt=ww;
minn=d;
}
}
if(sum>=m)
{
while(sum>=m)
{
sum-=a[ttt];
ttt++;
d--;
ww=abs(sum-m);
//printf("ww==%d\n",ww);
if(ww<=tt)
{
if(tt==ww)
minn=min(minn,d);
else
{
tt=ww;
minn=d;
}
}
}
}
}
printf("%d\n",minn);
return 0;
}
首先这个题是不能排序的。 因为序列中每个数的值是大于等于0的,所以可以采用尺取法来写。 可以从左向右依次扩展区间范围,如果当前区间的和大于了m,则区间左端右移,缩小区间范围。 如果当前区间的和小于了m,则区间右断点右移,扩大区间范围。在这个过程中保留最符合题意的结果。
#include<bits/stdc++.h>
#define MAX 100010
using namespace std;
int s[MAX];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%d",&s[i]);
int sum=s[1],l=0,r=1,ans=1,absmin=abs(m-s[1]);
while(1){
if(l==r&&r>=n)break;
if(sum<m&&r>=n)
sum-=s[++l];
else if(sum>=m)
sum-=s[++l];
else if(sum<m)
sum+=s[++r];
//printf("%d %d %d\n",sum,l,r);
if(abs(m-sum)<absmin&&r-l)
ans=r-l,absmin=abs(m-sum);
else if(abs(m-sum)==absmin && r-l)
ans=min(ans,r-l);
}
printf("%d\n",ans);
return 0;
}