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;
}