T1 瓦卡吃瓜瓜 (模拟)
1
5 5
AWaDa!
if一下就完事了因为都是两个瓜的一局,所以第一个数是偶数,那么-1,第二个是奇数–1
#include<bits/stdc++.h>
using namespace std;
int a,b;
int t;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
if(a%2==0)a--;if(b%2==1)b--; //比自己最多吃的那局的瓜多出一,没有用
if(a>b)puts("AWaDa!");
else puts("AKTang!");
}
return 0;
}
T2 烤乐滋炸桥(贪心)
读完题目可以发现,题目中的c没有可以忽略。然后把题目简化就是看看没有重叠的有几个桥。将桥尾从小到大排序,如果接下来的桥头大于桥尾,那么不重叠,炸弹++
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l;
int r;
}a[150000];
bool cmp(node x,node y)//从小到大
{
if(x.r==y.r)return x.l<y.r;
return x.r<y.r;
}
int main()
{
int n;cin>>n;
int q,ans=0;
for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r>>q;
sort(a+1,a+1+n,cmp);
q=0;
for(int i=1;i<=n;i++)
if(a[i].l>q)q=a[i].r,ans++;//没有重叠
cout<<ans;
return 0;
}
T3不一样的审美(dp)
题目描述
由于 xz 长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开, 车见车载。有一群 MM 排队看 xz。每个 MM 都有自己独特的风格,由于 xz 有着一 颗包容的心,所以,什么风格的 MM 他都喜欢…… 但,xz 有一个特别的要求,他不希望总是看到风格都差不多的 MM,更加 特别的是,如果两个 MM 风格完全一样,xz 不会有任何意见。 现在,xz 希望从去看他的 MM 中,去掉一些 MM,从而使得相邻 2 个 MM 的风 格值的差(绝对值)不为 1。自然地,xz 希望去掉的 MM 越少越好。
输入
第一行一个整数 N;
第 2~N+1 行,每行一个整数 Ci,表示第 i 个 MM 的风格值
输出
输出一个数,表示最少要去掉的 MM 数。
设立状态dp[i]表示前I个mm最多能留几个mm。第二重循环从第一个mm开始,到i-1个mm如果两个mm的abs值不为一,第i个mm就可以重第j个mm答案加1推过来
#include<bits/stdc++.h>
using namespace std;
int n,a[1500],dp[1500],b[1500];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],dp[i]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(abs(a[i]-a[j])!=1)
dp[i]=max(dp[i],dp[j]+1);//状态转移
cout<<n-dp[n];
return 0;
}
T4 瓦卡的旅行(DFS)
两遍dfs,第一遍从一开始找到与1连的路的最大知道的点,然后从找到的点开始,再跑一边,连一遍还没有连过的点
#include<bits/stdc++.h>
#define maxn 150000
using namespace std;
int a[maxn],head[maxn],tot,n,m,fa[maxn],ans[maxn];
struct node
{
int u;
int v;
}edge[maxn];
void add(int x,int y)
{
++tot;
edge[tot].u=head[x];
edge[tot].v=y;
head[x]=tot;
}
void dfs(int x)
{
fa[x]=x;
for(int i=head[x];i;i=edge[i].u)
{
if(fa[edge[i].v]==0)//有没有来过
{
dfs(edge[i].v);
if(ans[edge[i].v]>ans[x]){
ans[x]=ans[edge[i].v];//更新最大ans
fa[x]=fa[edge[i].v];
}
}
}
ans[x]+=a[x];
}
int read()
{
int x=0;char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c<='9'&&c>='0')
{
x=x*10+c-'0';
c=getchar();
}
return x;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=m;i++)
{
int x,y;x=read();y=read();
add(x,y);
add(y,x);
}
dfs(1);
int q=fa[1];找到那个点,从那里开始
memset(fa,0,sizeof(fa));
memset(ans,0,sizeof(ans));
dfs(q);
cout<<ans[q];
return 0;
}