哈尔滨工程大学第十四届程序设计竞赛(同步赛) 部分题解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37360631/article/details/90083316

A题
分析:如果我们想输出\或者是“这两个字符的时候需要加上转义字符。

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
	cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
	cout<<"\\\\                                                                      \\\\"<<endl;
	cout<<"\\\\                                                      @@              \\\\"<<endl;
	cout<<"\\\\                                                                      \\\\"<<endl;
	cout<<"\\\\   /@@@@@\\    \\@@/@@  @@@@@@@@@  @@@@@@@@  @@@@@@@@   @@     @@@@@\\@@ \\\\"<<endl;
	cout<<"\\\\  @@/   \\@@    @@@[        \/@@\"       @@/       @@/   @@    @@/   \\@@ \\\\"<<endl;
	cout<<"\\\\ @@@     @@@   @@         @@\/       \/@@\"      \/@@\"    @@   @@@     @@ \\\\"<<endl;
	cout<<"\\\\ @@       @@   @@       /@@        @@@       @@@      @@   @@      @@ \\\\"<<endl;
	cout<<"\\\\ @@@     @@@   @@      @@@       /@@       /@@        @@   @@@     @@ \\\\"<<endl;
	cout<<"\\\\  @@@\\]/@@/    @@     @@@@@@@@@ @@@@@@@@@ @@@@@@@@@   @@    @@@@]@@@@ \\\\"<<endl;;
	cout<<"\\\\                                                      @@           @@ \\\\"<<endl;
	cout<<"\\\\                                                     @@@           @@ \\\\"<<endl;
	cout<<"\\\\                                                   @@@/            @@ \\\\"<<endl;
	cout<<"\\\\                                                                      \\\\"<<endl;
	cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<<endl;
	return 0;
}

D-简单的烦恼
开始写的时候当成贪心问题写了,仔细想想是错误的,并不能保证时间短的排在前面,最后大于时间t的长度就最长。
这道题应该用01背包来写,先找到这组数据中最大的那个数,取出来,然后进行背包容量为t-1的背包。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int T;
int n,t;
int a[51100],dp[51100];
int main(){
    std::ios::sync_with_stdio(false);
    cin>>T;
    while(T--){
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        cin>>n>>t;
        int maxx=-1,v=-1;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]>maxx){
                maxx=a[i];
                v=i;
            }
        }
        for(int i=1;i<=n;i++){
            if(a[i]==maxx){continue;}
            for(int j=t-1;j>=a[i];j--){
                dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
            }
        }
        cout<<dp[t-1]+maxx<<endl;
    }
        
    return 0;
}


J素数筛
分析:这里用cin会超时,此外这里处理19937顺时针变化,处理的很巧妙。值得学习一下,开一个字符串数组,存储为1993719937,从前向后扫len个单位,即可得到该数的顺时针的全部数字。

#include<iostream>
#include<string.h>
#include<cmath>
#include<stdio.h>
#define maxn 10000010
int T;
int prime[11000000];
void db(){
    memset(prime,0,sizeof(prime));
    prime[0]=prime[1]=1;
    for(int i=2;i*i<=maxn;i++)			//注意,这里素数筛可以优化成i*i
        if(!prime[i])
            for(int j=2*i;j<=maxn;j+=i)
                prime[j]=1;
}
int main(){
    db();
    scanf("%d",&T);
    while(T--){
        bool flag=true;
        char s[30],ss[30];
        scanf("%s",s);
        int len=strlen(s);
        for(int i=0;i<len;i++){
            ss[i]=s[i];
            ss[i+len]=s[i];
        }
        for(int i=0;i<len;i++){
            int xx=0;
            for(int j=i;j<i+len;j++){
                xx=xx*10+ss[j]-'0';
            }
            if(prime[xx]) {flag=false;break;}
        }
        if(!flag) {printf("Imperfect.\n");}
        else {printf("Perfect!\n");}
    }
    
    return 0;
}


展开阅读全文

没有更多推荐了,返回首页