大一集训--考试--综合

综合考试

鄙人能力有眼,先附上已AC题目,其他题目会陆续更新
目前更新(6/8)

题目一:P2122

#include <bits/stdc++.h>
using namespace std;
struct b
{
    int x;
    int y;
    friend bool operator<(b x,b y)
    {
        if(x.x!=y.x)
            return x.x<y.x;
        else
            return x.y<y.y;
    }
};
int main()
{
    int n;
    cin >> n;
    map<b,int>m;
    struct b save;
    while(n--)
    {
        int x,y;
        cin >> x >> y;
        if(x<0)
        {
            x=-x;
            y=-y;
        }
        if(x==0&&y<0)
        {
            y=-y;
        }
        save.x=x;
        save.y=y;
        m[save]++;
    }
    map<b,int>::iterator it;
    int flag=0;
    for(it=m.begin(); it!=m.end(); it++)
    {
        if(it->second%2==0)
        {

            flag+=it->second;
        }
    }
    cout << flag << endl ;
    return 0;
}

题目二:P2120

#include <bits/stdc++.h>
using namespace std;
int sum[300005];
int main()
{
    int n,k;
    cin >> n >> k;
    int x;
    vector<int>ve;
    for(int i=1;i<=n;i++)
    {
        cin >> x;
        ve.push_back(x);
        if(i==1)
            sum[0]=x;
        else
            sum[i-1]=sum[i-2]+x;
    }
    //cout << sum[0] << sum[1] << sum[2] << sum[3]<< endl ;
    int l=0;
    int ans1=0,ans2=0;
    int flag=0;
    for(int r=0;r<ve.size();r++)
    {
        //cout << sum[r]-sum[l-1] << endl ;
        if(sum[r]-sum[l-1]<k)
            continue;
        if(sum[r]-sum[l-1]==k)
        {
            ans1=l+1;
            ans2=r+1;
            flag=1;
            break;
        }
        else
        {
            while(sum[r]-sum[l-1]>k)
                l++;
            if(sum[r]-sum[l-1]<k)
                continue;
            if(sum[r]-sum[l-1]==k)
            {
                ans1=l+1;
                ans2=r+1;
                flag=1;
                break;
            }
        }
    }
    if(flag)
    {
        cout << ans1 << " " << ans2 << endl ;
    }
    else
        cout << "tiangeniupi" << endl ;
    return 0;
}

题目三:P2103

#include <bits/stdc++.h>

using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    long long x,y;
    while(t--)
    {
        scanf("%lld%lld",&x,&y);
        unsigned long long ans;
        if(y<9)
            ans=0;
        else if(y<99)
            ans=1;
        else if(y<999)
            ans=2;
        else if(y<9999)
            ans=3;
        else if(y<99999)
            ans=4;
        else if(y<999999)
            ans=5;
        else if(y<9999999)
            ans=6;
        else if(y<99999999)
            ans=7;
        else if(y<999999999)
            ans=8;
        else if(y<9999999999)
            ans=9;
        else if(y<99999999999)
            ans=10;
        else if(y<999999999999)
            ans=11;
        else if(y<9999999999999)
            ans=12;
        else if(y<99999999999999)
            ans=13;
        else if(y<999999999999999)
            ans=14;
        else if(y<9999999999999999)
            ans=15;
        else if(y<99999999999999999)
            ans=16;
        else if(y<999999999999999999)
            ans=17;
        else if(y==1000000000000000000)
            ans=18;
        printf("%llu\n",ans*x);
    }
    return 0;
}

题目四:P2133

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin >> n >> m;
    set<int>s1;
    int x;
    for(int i=1;i<=n;i++)
    {
        cin >> x;
        s1.insert(x);
    }
    for(int i=1;i<=m;i++)
    {
        cin >> x;
        if(s1.count(x))
            s1.erase(x);
    }
    if(s1.size())
    {
        set<int>::iterator it;
        for(it=s1.begin();it!=s1.end();it++)
        {
            cout << *it << endl ;
        }
    }
    else
        cout << "So crazy!!!" << endl ;
    return 0;
}

题目五:P2123 此题不能用二分做,因为答案不连续!!!

方法一:vector

#include <bits/stdc++.h>

using namespace std;
int k,n;
vector<int>save;
int check(int x)
{
    vector<int>ve;
    ve=save;
    int sum=0;
    int flag=1;
    while(ve.size())
    {
        if(sum+*ve.begin()<=x)
        {
            sum+=*ve.begin();
            ve.erase(ve.begin());
            continue;
        }
        else
        {
            if(sum+*ve.rbegin()>x)
            {
                flag++;
                sum=*ve.begin();
                ve.erase(ve.begin());
            }
            else
            {
                vector<int>::iterator it;
                reverse(ve.begin(),ve.end());
                it=upper_bound(ve.begin(),ve.end(),x-sum);
                it--;
                sum+=*it;
                ve.erase(it);
                reverse(ve.begin(),ve.end());
            }
        }
        if(flag>k)
            return 0;
    }
    return 1;
}
int main()
{
    int T;
    scanf("%d",&T);
    int u=1;
    while(u<=T)
    {
        save.clear();
        scanf("%d%d",&n,&k);
        int i,sum=0;
        int x;
        for(i=1; i<=n; i++)
        {
            scanf("%d",&x);
            save.push_back(x);
            sum+=x;
        }
        sort(save.begin(),save.end(),greater<int>());
        int ans=sum/k;
        while(!check(ans))
        {
            ans++;
        }
        printf("Case #%d: %d\n",u,ans);
        u++;
    }
    return 0;
}

方法二:数组标记

#include <bits/stdc++.h>

using namespace std;
int k,n;
int save[1005];
int check(int x)
{
    bool a[1005]={0};
    int vis=0;
    for(int i=1;i<=k;i++)
    {
        int sum=0;
        for(int j=1;j<=n;j++)
        {
            if(sum+save[j]<=x&&a[j]==0)
            {
                sum+=save[j];
                a[j]=1;
                vis++;
            }
            if(vis==n)
                return 1;
        }
    }
    return 0;
}
int main()
{
    int T;
    scanf("%d",&T);
    int u=1;
    while(u<=T)
    {
        memset(save,0,sizeof(save));
        scanf("%d%d",&n,&k);
        int i,maxx=0;
        int x;
        int sum=0;
        for(i=1; i<=n; i++)
        {
            scanf("%d",&x);
            save[i]=x;
            sum+=x;
        }
        sort(save+1,save+1+n,greater<int>());
        int ans=sum/k;
        while(!check(ans))
        {
            ans++;
        }
        printf("Case #%d: %d\n",u,ans);
        u++;
    }
    return 0;
}

题目六:P2126 结果会超int,用longlong

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    long long flag=0;
    int x1,x2,ry1,y2;
    map<double,int>visk;
    map<pair<double,double>,int>viskb;
    for(int i=1; i<=n; i++)
    {
        scanf("%d%d%d%d",&x1,&ry1,&x2,&y2);
        double k;
        double b;
        if(x1==x2)
            k=10000000000;//用它来表示垂直于x轴的斜率
        else
            k=(y2-ry1)*1.0/(x2-x1);
        if(x1!=x2)
            b=ry1-k*x1;
        else
            b=x1;//垂直x轴的时候用b来记录x的值
        flag+=(i-1-visk[k]);//之前输入的一共有多少斜率不同的,直接加上
        flag+=viskb[{k,b}];//斜率相同且b也相同的也直接加上
        visk[k]++;
        viskb[{k,b}]++;
    }
    printf("%lld\n",flag);
    return 0;
}
发布了44 篇原创文章 · 获赞 13 · 访问量 2329

猜你喜欢

转载自blog.csdn.net/NEFU_kadia/article/details/104455870