https://cn.vjudge.net/contest/228009#problem/Q
题意:
就是判断是否是完美匹配(每一个点都被匹配),简单水题
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define ll long long
#define mod 1000000007
using namespace std;
int a[100005];
int main()
{
int t,i,j,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<n;i++)
scanf("%d",&a[i]);
if(n%2)
printf("No\n");
else
{
int ans;
ans=0;
for(i=n-1;i>0;i--)
{
if(a[i]==2)
ans--;
else
ans++;
if(ans<0)
break;
}
if(i==0)
printf("Yes\n");
else
printf("No\n");
}
}
}
这个题我竟然没有1A,原因竟然是把输入T,写成了输入N
https://cn.vjudge.net/contest/228009#problem/E
题意;
就是看矩阵里某两个字符串出现的次数
分析:
两个深搜。。。。水题
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define ll long long
#define mod 1000000007
using namespace std;
char c[1005][1005];
int n,m,ans,ant;
int b[4][2]={1,0,-1,0,0,1,0,-1};
bool ok(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m)
return true;
return false;
}
void dfs1(int x,int y,int num)
{
int i,aa,bb;
if(num==3)
{
ans++;
return;
}
for(i=0;i<4;i++)
{
aa=b[i][0]+x;
bb=b[i][1]+y;
if(num==0&&ok(aa,bb)&&c[aa][bb]=='i')
dfs1(aa,bb,num+1);
else
if(num==1&&ok(aa,bb)&&c[aa][bb]=='r')
dfs1(aa,bb,num+1);
else
if(num==2&&ok(aa,bb)&&c[aa][bb]=='l')
dfs1(aa,bb,num+1);
}
return;
}
void dfs2(int x,int y,int num)
{
int i,aa,bb;
if(num==2)
{
ant++;
return;
}
for(i=0;i<4;i++)
{
aa=b[i][0]+x;
bb=b[i][1]+y;
if(num==0&&ok(aa,bb)&&c[aa][bb]=='a')
dfs2(aa,bb,num+1);
else
if(num==1&&ok(aa,bb)&&c[aa][bb]=='t')
dfs2(aa,bb,num+1);
}
return;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%s",&c[i]);
ans=ant=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(c[i][j]=='g')
{
dfs1(i,j,0);
}
else
if(c[i][j]=='c')
{
dfs2(i,j,0);
}
}
}
printf("%d %d\n",ans,ant);
}
}
https://cn.vjudge.net/contest/228009#problem/U
题意:
就是找出串里的字母没有一样的最长的串
分析:
用一个数组记录与此时位置相同字母前一次出现的位置
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define mod 1000000007
using namespace std;
int Next[500];
char s[10000005];
int maxn,l,r;
int main()
{
int n,i,j,num,rr,ll,m;
while(~scanf("%d",&n))
{
//cin>>s;
scanf("%s",&s);
memset(Next,-1,sizeof(Next));
maxn=-1;
l=r=0;
rr=ll=0;
// num=0;
m=strlen(s);
for(i=0;i<m;i++)
{
if(Next[s[i]]<ll)
{
Next[s[i]]=i;
//rr=i;
if(maxn<i-ll+1)
{
maxn=i-ll+1;
r=i;
l=ll;
}
}
else
{
ll=Next[s[i]]+1;
Next[s[i]]=i;
//rr=i;
}
}
printf("%d %d %d\n",maxn,l,r);
}
}
这个题我TLE好几次,就是在循环条件里用了s.size(),但是要是把长度赋给一个变量,就不会超时
https://cn.vjudge.net/contest/228009#problem/W
题意;
幸运值每天都减少,尽量使幸运值和最大,一天只能一个人,从n个人里找出k 个人
分析:
就是贪心+dp,将数组按照幸运值减少的值从大到小排序
选择k个人的时候需要用到dp
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define ll long long
#define mod 1000000007
using namespace std;
struct node
{
int val,des;
bool operator<(const node &aa)const
{
if(des!=aa.des)
return des>aa.des;
return val>aa.val;
}
}v[1005];
int dp[1005];
int main()
{
int n,i,j,k;
while(~scanf("%d%d",&n,&k))
{
for(i=0;i<n;i++)
scanf("%d",&v[i].val);
for(i=0;i<n;i++)
scanf("%d",&v[i].des);
sort(v,v+n);
for(i=0;i<=n;i++)
dp[i]=-inf;
dp[0]=0;
for(i=0;i<n;i++)
{
for(j=k;j>0;j--)
{
dp[j]=max(dp[j],dp[j-1]+v[i].val-v[i].des*(j-1));
}
}
printf("%d\n",dp[k]);
}
}
https://cn.vjudge.net/contest/228009#problem/N
题意:
就是在一个无向图里进行删边操作,使它的每一个点到0距离最短,问有几种方案
分析:
就是一个最短路径的模板
代码;
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include <sstream>
#define inf 80000000
#define ll long long
#define mod 1000000007
using namespace std;
int a[55][55];
char c[55][55];
int dp[100],n;
bool vis[100];
long long int ans;
struct node
{
int id;
bool operator<(const node &aa)const
{
return dp[id]>dp[aa.id];
}
};
void dfs()
{
int i,j;
dp[0]=0;
for(i=1;i<n;i++)
dp[i]=inf;
priority_queue<node>q;
node now,next;
now.id=0;
q.push(now);
vis[0]=1;
while(!q.empty())
{
now=q.top();
//vis[now.id]=1;
q.pop();
//printf("555555dkjsfko\n");
for(i=0;i<n;i++)
{
if(i==now.id)continue;
if(c[now.id][i]!='0')
if(dp[i]>dp[now.id]+c[now.id][i]-'0')
{
//printf("ok\n");
dp[i]=dp[now.id]+c[now.id][i]-'0';
if(!vis[i])
{
next.id=i;
vis[i]=1;
q.push(next);
}
}
}
}
}
int main()
{
int i,j,k;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
scanf("%s",&c[i]);
ans=1;
memset(vis,0,sizeof(vis));
dfs();
bool flag;
flag=0;
for(i=1;i<n;i++)
{
if(dp[i]==inf)
{
ans=0;
break;
}
//printf("lll %d\n",dp[i]);
ll sum;
sum=0;
for(j=0;j<n;j++)
{
if(i==j)continue;
if(c[i][j]!='0'&&dp[i]==dp[j]+c[j][i]-'0')
sum++;
}
//printf("****** %lld\n",sum);
ans=ans*sum;
ans=ans%mod;
// if(flag)break;
}
printf("%lld\n",ans);
}
}