第一题: 魔法串 水题,贴代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
using namespace std;
const int N = 1009;
char a[N],b[N];
int v[39][39];
vector<int> L[39];
queue<int> que;
void init()
{
memset(v,0,sizeof(v));
for(int i=0;i<26;i++)
{
v[i][i] = 1;
while(!que.empty()) que.pop();
que.push(i);
while(!que.empty())
{
int e = que.front();que.pop();
for(int j=0;j<(int)L[e].size();j++)
{
int to = L[e][j];
if(v[i][to]==0)
{
v[i][to] = 1;
//que.push(to);
}
}
}
}
}
int A[N],B[N];
int solve()
{
int l1 = strlen(a),l2=strlen(b);
for(int i=0;i<l1;i++) A[i] = a[i]-'a';
for(int j=0;j<l2;j++) B[j] = b[j]-'a';
for(int i=0,j=0;i<l1;i++)
{
int f = 0;
for(;j<l2;)
{
if(v[B[j]][A[i]])
{
j++;
f = 1;break;
}
j++;
}
if(!f) return 0;
}return 1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int cas,T=1;scanf("%d",&cas);
while(cas--)
{
scanf("%s%s",a,b);
int m;
scanf("%d",&m);
for(int i=0;i<36;i++) L[i].clear();
while(m--)
{
char c1[3],c2[3];
scanf("%s%s",c1,c2);
L[c1[0]-'a'].push_back(c2[0]-'a');
}
init();
printf("Case #%d: %s\n",T++,solve()?"happy":"unhappy");//solve()
}
return 0;
}
第二题:比赛难度 随便搞搞,怎么搞都能过.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
using namespace std;
const int N = 10009;
struct nod{
int val1,val2,p;
bool operator<(const nod t) const
{
return val1>t.val1||(val1==t.val1&&val2>t.val2);
}
};
priority_queue<nod> que;
int re[N];
int n,m;
int solve()
{
sort(re,re+n);
re[n] = 0x3f3f3f3f;
nod e,t;
while(!que.empty()) que.pop();
e.p =0;e.val1 = re[0];
e.val2 =0;
que.push(e);
for(int i=1;i<m;i++)
{
e = que.top();que.pop();
int p = e.p +1;
t.p = p;
t.val1 = e.val2+re[p];
t.val2 = e.val2;
que.push(t);
t.val1 = e.val1+re[p];
t.val2 = e.val1;
que.push(t);
}e = que.top();
return e.val1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int cas,T=1;scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&re[i]);
printf("Case #%d: %d\n",T++,solve());
}
return 0;
}
第三题: 不会...好伤心..