感觉不错,全部1A,虽然第二题打得有点久,似乎其他题都是十分钟1A的- =
第一题:判断素数
#include
using namespace std;
typedef long long ll;
const int N=10000+5;
char ss[N];
int check(ll x)
{
for(int i=2;1LL*i*i<=x;i++)
if(x%i==0)
return 0;
return 1;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
scanf("%s",ss);
bool flag=0;
for(int i=0;i<=n-k;i++)
{
ll sum=0;
for(int j=i;j<i+k;j++)
sum=sum*10+ss[j]-'0';
if(check(sum))
{
flag=1;
for(int j=i;j<i+k;j++)
printf("%c",ss[j]);
puts("");
break;
}
}
if(!flag) puts("404");
return 0;
}
第二题:STL统计
#include
#include
#include
#include
#include
#include
using namespace std;
const int N=1e4+5;
struct Q1
{
char card[20];
int score;
bool operator<(const Q1& q)const
{
if(score!=q.score) return score>q.score;
return strcmp(card,q.card)<0;
}
};
struct Q2
{
int site,num;
bool operator<(const Q2&q)const
{
if(num!=q.num) return num>q.num;
return site<q.site;
}
}q2[N];
set<Q1> st[10];
int st2[N][2];
vector<int> st3[N];
set<Q2> outp;
map<int,int> outp1;
map<string,int> mp;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int cnt=0;
for(int i=1;i<=n;i++)
{
int score;
char card[30];
scanf("%s%d",card,&score);
char level;
int sitenum=0;
int num=0;
level=card[0];
for(int j=1;j<4;j++)
sitenum=sitenum*10+card[j]-'0';
char date[20];
int len=0;
for(int j=4;j<10;j++)
date[len++]=card[j];
date[len]='\0';
for(int j=10;j<13;j++)
num=num*10+card[j]-'0';
Q1 q;
q.score=score;strcpy(q.card,card);
if(level=='T') st[0].insert(q);
else if(level=='A') st[1].insert(q);
else st[2].insert(q);
st2[sitenum][0]+=1,st2[sitenum][1]+=score;
if(!mp.count(date)) mp[date]=++cnt;
st3[mp[date]].push_back(sitenum);
}
int cas=1;
while(m--)
{
int op;
char pp[20];
scanf("%d%s",&op,pp);
printf("Case %d: %d %s\n",cas++,op,pp);
if(op==1)
{
if(pp[0]=='T')
{
if(st[0].size()==0)
puts("NA");
else
{
for(set<Q1>::iterator it=st[0].begin();it!=st[0].end();it++)
printf("%s %d\n",it->card,it->score);
}
}
else if(pp[0]=='A')
{
if(st[1].size()==0)
puts("NA");
else
{
for(set<Q1>::iterator it=st[1].begin();it!=st[1].end();it++)
printf("%s %d\n",it->card,it->score);
}
}
else
{
if(st[2].size()==0)
puts("NA");
else
{
for(set<Q1>::iterator it=st[2].begin();it!=st[2].end();it++)
printf("%s %d\n",it->card,it->score);
}
}
}
else if(op==2)
{
int sitenum;
sscanf(pp,"%d",&sitenum);
if(st2[sitenum][0]==0)
puts("NA");
else
printf("%d %d\n",st2[sitenum][0],st2[sitenum][1]);
}
else
{
outp.clear();
outp1.clear();
if(!mp.count(pp)||st3[mp[pp]].size()==0)
puts("NA");
else
{
for(int i=0;i<st3[mp[pp]].size();i++)
{
int v=st3[mp[pp]][i];
outp1[v]++;
}
for(map<int,int>::iterator it=outp1.begin();it!=outp1.end();it++)
{
Q2 q;
q.site=it->first,q.num=it->second;
outp.insert(q);
}
for(set<Q2>::iterator it=outp.begin();it!=outp.end();it++)
printf("%03d %d\n",it->site,it->num);
}
}
}
return 0;
}
第三题:暴力判断
#include
#include
#include
using namespace std;
const int N=1e4+5;
int n,m,a[N];
vector<int> G[N];
set<int> st;
int check()
{
for(int i=0;i<n;i++)
for(int j=0;j<G[i].size();j++)
if(a[i]==a[G[i][j]])
return 0;
return 1;
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
int q;scanf("%d",&q);
while(q--)
{
st.clear();
for(int i=0;i<n;i++)
{
scanf("%d",a+i);
st.insert(a[i]);
}
if(check()) printf("%d-coloring\n",st.size());
else puts("No");
}
return 0;
}
第四题:堆(原题)
#include
#include
using namespace std;
const int N=1000+5;
vector<int> now;
vector< vector<int> > res;
int flag1,flag2,n,a[N];
void dfs1(int u)//xiao
{
now.push_back(a[u]);
int ls=u<<1,rs=u<<1|1,s=0;
if(rs<=n)
{
dfs1(rs),s++;
if(a[rs]<=a[u]) flag1=0;
}
if(ls<=n)
{
dfs1(ls),s++;
if(a[ls]<=a[u]) flag1=0;
}
if(s==0) res.push_back(now);
now.pop_back();
}
void dfs2(int u)//da
{
int ls=u<<1,rs=u<<1|1;
if(rs<=n)
{
dfs2(rs);
if(a[rs]>=a[u]) flag2=0;
}
if(ls<=n)
{
dfs2(ls);
if(a[ls]>=a[u]) flag2=0;
}
}
int main()
{
flag1=flag2=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
dfs1(1);
dfs2(1);
for(int i=0;i<res.size();i++)
for(int j=0;j<res[i].size();j++)
printf("%d%c",res[i][j]," \n"[j+1==res[i].size()]);
if(flag1) puts("Min Heap");
else if(flag2) puts("Max Heap");
else puts("Not Heap");
return 0;
}