第三届河南省程序大赛可做题题解:

B:素数
一个简单的模拟题,没什么可说的
直接看代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
int prime[maxn];
bool Prime()
{
    prime[1]=false;
    for (int i = 2; i <= maxn; i++)
    {
        prime[i] = true;
    }
    for (int i = 1; i * i <= maxn; i++)
    {
        if (prime[i])
        {
            for (int j = i * i; j <= maxn; j += i)
            {
                prime[j] = false;
            }
        }
    }
}
int main()
{
    Prime();
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int x;
        scanf("%d",&x);
        if(prime[x])
        {
            printf("%d\n",x);
        }
        else
        {
            int dis_1=0,dis_2=0;
            int id_1,id_2;
            for(int i=x;;i++)
            {
                dis_1++;
                if(prime[i])
                {
                    id_1=i;
                    break;
                }
            }
            for(int i=x;;i--)
            {
                dis_2++;
                if(prime[i])
                {
                    id_2=i;
                    break;
                }
            }
            if(dis_1<=dis_2)
            {
                printf("%d\n",id_1);
            }
            else
            {
                printf("%d\n",id_2);
            }
        }
    }
}

D:聪明的kk
一道经典又简单的动态规划
找一下状态即可
ac代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
int dp[maxn][maxn];
int num[maxn][maxn];
int n,m;
void dp_s()
{
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dp[i][j]=max(dp[i-1][j],dp[i][j-1])+num[i][j];
        }
    }
    printf("%d\n",dp[n][m]);
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&num[i][j]);
        }
    }
    dp_s();

}

C:网络的可靠性
一道简单的思路题,一开始以为是连通图,感觉还挺复杂的,没想到就记录一下入度和出度而已
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
vector<int>vec[maxn];
//是任意一个点的出度和入度都大于1
int in[maxn],out[maxn];//出度和入度
int n;//代表边数
void input()
{
    int u,v;
    memset(in,0,sizeof(in));
    memset(out,0,sizeof(out));
    for(int i=1;i<n;i++)
    {
        scanf("%d %d",&u,&v);
        //vec[u].push_back[v];
        out[u]++;//u的出度++
        in[v]++;//v的入度++
        //vec[u].push_back[v];
        out[v]++;
        in[u]++;
    }
}
void print()
{
    int ans=0,id=0;
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0&&out[i]==0)
        {
            id++;
        }
        if(in[i]<2||out[i]<2)
        {
            ans++;
        }
    }
    ans=id+ans/2+(ans%2!=0);
    printf("%d\n",ans);
}
int main()
{
    while(~scanf("%d",&n))
    {
    input();
    print();
    }
}

F: BUYING FEED
一道简单的贪心问题,主要是因为是英文题,没看懂,就凉凉了
AC代码:

#include<bits/stdc++.h>
using namespace std;
struct store{
	int x,f,c;
};
bool cmp(struct store s1,struct store s2){
	return s1.c<s2.c;
}
int main()
{
	int C,k,e,n;
	while(scanf("%d",&C)!=EOF){
		while(C--){
			cin>>k>>e>>n;
			struct store st[n+2];
			for(int i=0;i<n;i++){
				scanf("%d%d%d",&st[i].x,&st[i].f,&st[i].c);
				st[i].c+=e-st[i].x;  //因为无论在哪个商店买东西都需要运送到终点,索性将单价加上路程费用创造新的单价, 
			}
			sort(st,st+n,cmp);  //将商店按照新单价 从小到排序 
			int sum1=0;
			for(int i=0;i<n;i++){  //从新单价最小的买起,直至满足k 
				if(k>st[i].f){     //若k大于当前商店最大销售量,则直接买完 
					sum1+=st[i].f*st[i].c;    
					k-=st[i].f;
				}else{             //能在此商店达到购买量k,则买到k,退出循环 
					sum1+=k*st[i].c;
					break; 
				} 
			}
			cout<<sum1<<endl;
		}
	}
	return 0; 
}

H :AMAZING AUCTION
一道简单的模拟题,也没啥可说的,直接模拟就行
AC代码:

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    string name;
    int num;
}a[1005];
int main()
{
    int u, m;
    while(~scanf("%d%d", &u, &m))
    {
        string ans_name;
        int ans;
        for(int i = 0; i < 1005; i++)
            a[i].num = 0;
        for(int i = 1; i <= m; i++)
        {
            string ch;
            int x;
            cin>>ch>>x;
            if(a[x].num == 0)
                a[x].name = ch;
            a[x].num++;
        }
        int temp = 1;
        for(int i = 1; i <= u; i++)
        {
            if(a[i].num == temp) {ans_name = a[i].name; ans = i; break;}
            if(i == u){temp++; i = 1;}
        }
        cout<<"The winner is "<<ans_name<<endl;
        cout<<"The price is "<<ans<<endl;
    }
}

A:房间安排
一道不太简单的思路题,可以用暴力写,枚举订单上重叠的天数然后加上房间量,然后比较最大值即可
AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
struct node
{
    int s_t;//开始时间
    int e_l;//结束时间
    int d_n;//住宿间数
}temp[maxn];
int id[maxn];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(id,0,sizeof(id));
        int maxx=~0x3f3f3f3f3f,n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d %d %d",&temp[i].d_n,&temp[i].s_t,&temp[i].e_l);
            temp[i].e_l+=temp[i].s_t;
        }
        for(int i=0;i<n;i++)
        {
            for(int j=temp[i].s_t;j<temp[i].e_l;j++)
            {
                id[j]+=temp[i].d_n;
                maxx=max(id[j],maxx);
            }
        }
        printf("%d\n",maxx);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值