省赛题目

房间安排

乍一看,觉得类似会场安排 ,仔细一看 不是。艹,总是容易现在一种思维里出不来。只需要先确定每一天需要的房间数目,再输出这些天中 需要房间数目的最大值即可:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int ans[100];
int main()
{
    int t,n,num,st,tem;
    cin>>t;
    while(t--)
    {
        cin>>n;
        memset(ans,0,sizeof(ans));
        while(n--)
        {
            cin>>num>>st>>tem;
            for(int i=0;i<tem;i++)
                ans[i+st]+=num;
        }
        cout<<*max_element(ans,ans+199)<<endl;
    }
    return 0;
}

素数


给出一个数找到距离他最近的一个素数,如果距离相等 输出较大的素数,如果他本身是素数,输出该数。写一个函数判断是否为素数,从该数开始向前,向后遍历;

注意:1             !!!!!!!

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int ans[100];
int isprim(int n)
{
    for(int i=2;i*i<=n;i++)
        if(n%i==0)
            return 0;
    return 1;
}
int main()
{
    int t,n,tem1,st,tem,i;
    cin>>t;
    while(t--)
    {
        cin>>n;
        if(isprim(n))
        {
            if(n==1)
            cout<<n+1<<endl;
            else
                cout<<n<<endl;
        }

        else
        {
            for(i=n-1;;i--)
                if(isprim(i))
                    break;
            tem1=i;
            for(i=n+1;;i++)
                if(isprim(i))
                    break;
            tem=(n-tem1)>=(i-n)?i:tem1;
            cout<<tem<<endl;
        }
    }
    return 0;
}

网络的可靠性


给一个连通图,添加一些边确保在损坏某些路的时候依然能连通,即每个点的度至少为2;找出度为一的点,除以2,即为结果;
code:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int dis[11000];
int main()
{
    int n,sum,a,b,i,m;
    while(scanf("%d",&n)!=EOF)
    {
        memset(dis,0,sizeof(dis));
        sum=0;
        m=n-1;
        while(m--)
        {
            scanf("%d%d",&a,&b);
            dis[a]++;
            dis[b]++;
        }
        for(i=1; i<=n; ++i)
            if(dis[i]==1)
                sum++;
        if(sum&1)
            printf("%d\n",(sum+1)/2);
        else
            printf("%d\n",sum/2);
    }
    return 0;
}

AMAZING AUCTION


最佳竞标价有两个标准:

1.在上限以内,只出现一次的最小竞标价;

2。若无竞标价则选次数最少且出价最低的

code:

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
struct node{
string s;
int doll;
}node[1100];
int money[1100];
int main()
{
    int u,n,m,i,j,ans;
    while(scanf("%d%d",&u,&m)!=EOF)
    {
        memset(money,0,sizeof(money));
        for(i=0;i<m;i++)
        {
            cin>>node[i].s>>node[i].doll;
            money[node[i].doll]++;//计算出标价的数量
        }
        int mindoll=10000,flag;
        for(i=0;i<=1000;i++)
            if(money[i] && money[i]<mindoll)
        {
            mindoll=money[i];
            flag=i;
        }
       // cout<<"flag= "<<flag<<endl;
          for(i=0;i<m;i++)
                if(node[i].doll==flag)
                break;
          cout<<"The winner is "<<node[i].s<<endl<<"The price is "<<flag<<endl;
    }
    return 0;
}

BUYING FEED



code:贪心,将从每个商店买一磅饲料的单价+路程耗费 作为该店的最终单价,再对新单价进行排序 贪心求最小值

#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct nodee
{
    int pos,f,c,ec;
} node[111];
int cmp(nodee a,nodee b)
{
    return a.ec<b.ec;
}
int main()
{
    int i,k,e,n,t;
    cin>>t;
    while(t--)
    {
        scanf("%d%d%d",&k,&e,&n);
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&node[i].pos,&node[i].f,&node[i].c);
        node[i].ec=(e-node[i].pos)+node[i].c;
        }
        sort(node,node+n,cmp);
        int count=0,sum=0;
        for(i=0; i<n; i++)
        {
            if(count<k)
            {
                if(count+node[i].f<=k)
                {
                    sum+=node[i].f*node[i].ec;
                    count+=node[i].f;
                    if(count==k)
                        break;
                }
                else
                {
                    sum+=(k-count)*node[i].ec;
                    break;
                }

            }
        }
        cout<<sum<<endl;
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值