AtCoder Beginner Contest 181

做题情况

A B C D E F
ac ac ac 赛后ac ac  

 

A - Heavy Rotation

 

B - Trapezoid Sum

 

C - Collinearity

题意:给你n个点,让你找出三个点在一条直线上,如果有输出Yes,否则输出No

思路:根据一点点的数学可以知道,如果三个点的的斜率相等的话那么他们就是在一条直线上的

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<cstring>
#include<string>
#include<set>
//#include<unordered_map>
using namespace std;

#define m_p make_pair
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)(x).size()
#define pi acos(-1)
#define IO ios::sync_with_stdio(false);cin.tie(0)
typedef  long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int eps=1e-9;
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline int lcm(int a,int b){return a*b/gcd(a,b);}
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
// inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
// inline void read(int &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
const int maxn=1e5+50;
struct node
{
    int  x,y;
}e[maxn];

int main()
{
    //IO;
    int n;
    cin>>n;
    for(int i=0;i<n;++i)
    {
        cin>>e[i].x>>e[i].y;
    }
    int flag=0;
    for(int i=0;i<n;++i)
    {
        for(int j=i+1;j<n;++j)
        {
            for(int k=j+1;k<n;++k)
            {
                if(e[i].x==e[j].x&&e[i].y==e[j].y&&e[i].x==e[k].x&&e[i].y==e[k].y)
                {
                    flag=1;
                    break;
                }else if((e[i].x-e[j].x)*(e[k].y-e[j].y)==(e[i].y-e[j].y)*(e[k].x-e[j].x))
                {
                    flag=1;
                    break;
                }
            }
        }
    }
    if(flag) cout<<"Yes\n";
    else cout<<"No\n";
    return 0;
}
View Code

 

D - Hachi 

题意:给你一个字符串,让你从新组合这地邪恶数组,看是否能被8整除,能的话输出Yes,否则输出No

思路:其实做的时候就已经发现规律的,就如果你是三位数及以上的,如果百位是奇数,那么下面两个数余4,就可以被8整除;如果是偶数,被8整除就可以了

然后我就把它想的很复杂,赛后一想,你去用100到1000之间能被8整除的数一个一个去判断的就可以了。

// #include<cstdio>
// #include<cmath>
// #include<iostream>
// #include<algorithm>
// #include<vector>
// #include<map>
// #include<stack>
// #include<queue>
// #include<cstring>
// #include<string>
// #include<set>
// //#include<unordered_map>
// using namespace std;

// #define m_p make_pair
// #define fi first
// #define se second
// #define pb push_back
// #define sz(x) (int)(x).size()
// #define pi acos(-1)
// #define IO ios::sync_with_stdio(false);cin.tie(0)
// typedef  long long ll;
// typedef pair<int,int> pii;
// typedef pair<ll,ll>pll;
// const int inf=0x3f3f3f3f;
// const ll INF=0x3f3f3f3f3f3f3f3f;
// const int eps=1e-9;
// inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
// inline int lcm(int a,int b){return a*b/gcd(a,b);}
// inline int read()
// {
//     int x=0,f=1;
//     char ch=getchar();
//     while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}
//     while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
//     return x*f;
// }
// // inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
// // inline void read(int &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
// const int maxn=1e5+50;
// string s;
// // void init()
// // {
// //     ll ans=1;
// //     for(int i=0;i<20;++i)
// //     {
// //         ans*=8;
// //         cout<<ans<<endl;
// //     }
// // }
// int vis[maxn];
// bool judge(int x)
// {
//     int tmp[15]={};
//     while(x)
//     {
//         tmp[x%10]++;
//         x/=10;
//     }
//     bool flag=true;
//     for(int i=0;i<=9;++i)
//     {
//         if(tmp[i]>vis[i])
//         {
//             flag=false;
//             break;
//         }
//     }
//     return flag;
// }
// int main()
// {
//     //IO;
//     //init();
//     memset(vis,0,sizeof vis);
//     cin>>s;
//     if(s.size()==1)
//     {
//         if(s=="8") cout<<"Yes\n";
//         else cout<<"No\n";
//     }else if(s.size()==2)
//     {
//         int num=0;
//         for(int i=0;i<2;++i) num=num*10+s[i]-'0';
//         if(num%8==0) cout<<"Yes\n";
//         else
//         {
//             int num1=num/10+num%10*10;
//             if(num1%8==0) cout<<"Yes\n";
//             else cout<<"No\n";
//         }
//     }else
//     {
//         memset(vis,0,sizeof vis);
//         for(int i=0;i<s.size();++i)
//         {
//             vis[s[i]-'0']++;
//         }
//         int flag=0;
//         for(int i=104;i<=1000;i+=8)
//         {
//             if(judge(i))
//             {
//                 cout<<"Yes\n";
//                 flag=1;
//                 break;
//             }
//         }
//         if(!flag) cout<<"No\n";
//     }
//     return 0;
// }
#include<bits/stdc++.h>
using namespace std;
string s;
int vis[20];
bool work(int x)
{
    int tmp[20]={};
    while(x)
    {
        tmp[x%10]++;
        x/=10;
    }
    for(int i=0;i<10;++i)
    {
        if(vis[i]<tmp[i])  return false;
    }
    return true;
}
int main()
{
    cin>>s;
    if(s.size()==1)
    {
        if(s=="8") cout<<"Yes\n";
        else cout<<"No\n";
    }else if(s.size()==2)
    {
        int num=0;
        for(int i=0;i<2;++i)
        {
            num=num*10+s[i]-'0';
        }
        if(num%8==0) cout<<"Yes\n";
        else
        {
            int num1=num/10+num%10*10;
            if(num1%8==0) cout<<"Yes\n";
            else cout<<"No\n";
        }
    }else
    {
        memset(vis,0,sizeof vis);
        for(int i=0;i<s.size();++i)
        {
            vis[s[i]-'0']++;
        }
        int flag=0;
        for(int i=104;i<1000;i+=8)
        {
            if(work(i)) 
            {
                cout<<"Yes\n";
                flag=1;
                break;
            }
        }
        if(!flag) cout<<"No\n";
    }
    return 0;
}
View Code

 

E - Transformable Teacher

题意:给你奇数个数,下面给你m个数,挑选一个放到当中,两两组合的差的和的最小值。

思路:一开始就想到了,这个是可以用前缀和去做的题目,就你如果插入的位数为偶数位n,那么前n-1项的值是可以知道的,后n+1项到最后也是可以知道的,然后就可以了

然后就是很菜,找bug找了有半个多少小时。

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<cstring>
#include<string>
#include<set>
//#include<unordered_map>
using namespace std;

#define m_p make_pair
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)(x).size()
#define pi acos(-1)
#define IO ios::sync_with_stdio(false);cin.tie(0)
typedef  long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>pll;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int eps=1e-9;
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline int lcm(int a,int b){return a*b/gcd(a,b);}
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
// inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
// inline void read(int &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
const int maxn=2e5+50;
string s;
void init()
{
    ll ans=1;
    for(int i=0;i<20;++i)
    {
        ans*=8;
        cout<<ans<<endl;
    }
}
int vis[maxn];
int n,m,a[maxn],b[maxn],c[maxn];
ll sum1[maxn],sum2[maxn];
int main()
{
    //IO;
    //init();
    cin>>n>>m;
    for(int i=1;i<=n;++i) cin>>a[i];
    for(int i=1;i<=m;++i) cin>>b[i];
    sort(a+1,a+n+1);
    for(int i=2;i<=n;++i)
    {
        c[i-1]=a[i]-a[i-1];
        
        if((i-1)%2==0) sum2[i-1]+=c[i-1]+sum2[i-2],sum1[i-1]+=sum1[i-2];
        else sum1[i-1]+=c[i-1]+sum1[i-2],sum2[i-1]+=sum2[i-2];
    }
//    for(int i=1;i<n;++i)
//    {
//        cout<<sum1[i]<<" "<<sum2[i]<<endl;
//    }
    sum1[n]=sum1[n-1],sum2[n]=sum2[n-1];
    ll ans=1e18;
    for(int i=1;i<=m;++i)
    {
        int pos=lower_bound(a+1,a+n+1,b[i])-a;
        //cout<<pos<<endl;
        if(pos%2)
        {
            ll sum=sum1[pos-1]-sum1[0]+sum2[n-1]-sum2[pos]+a[pos]-b[i];
//            cout<<pos<<endl;
//            cout<<sum1[pos-1]-sum1[0]<<" "<<sum1[pos-1]<<" "<<sum1[0]<<endl;
//            cout<<sum2[n-1]-sum2[pos]<<" "<<sum2[n-1]<<" "<<sum2[pos]<<endl;
//            cout<<a[pos]-b[i]<<" "<<a[pos]<<" "<<b[i]<<endl;
            ans=min(sum,ans);
           // cout<<sum<<endl;
        }else
        {
            ll sum=sum1[pos-2]-sum1[0]+sum2[n-1]-sum2[pos-1]+b[i]-a[pos-1];
//            cout<<pos<<endl;
//            cout<<sum1[pos-2]-sum1[0]<<" "<<sum1[pos-2]<<" "<<sum1[0]<<endl;
//            cout<<sum2[n-1]-sum2[pos-1]<<" "<<sum2[n-1]<<" "<<sum2[pos-1]<<endl;
//            cout<<b[i]-a[pos-1]<<" "<<a[pos-1]<<" "<<b[i]<<endl;
            ans=min(sum,ans);
           // cout<<sum<<endl;
        }
    }
    cout<<ans<<endl;
    return 0;
}
View Code

 

posted @ 2020-11-02 22:53  passawayy  阅读(125)  评论(0)    收藏  举报