AYITOJ Easy Round #3

A. 红绿灯

题意:水题

#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;
}

lxd序列

题意:就是搞清他怎么输出字符串的就行了

思路:俺不想解释这个了,烦死,调试了半天;

#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;
}
发布了121 篇原创文章 · 获赞 3 · 访问量 3401

猜你喜欢

转载自blog.csdn.net/qq_45585519/article/details/103329834