1092 To Buy or Not to Buy(20)模拟
【题意】
Eva需要给定数目及颜色的珠子,若商店的珠子满足她的需求,则输出Yes,并输出她需要多买多少珠子,如果不能满足则输出No,并输出还差多少珠子可以满足她的需求。
【解题思路】
用s1存储Eva需要的不同颜色珠子的个数,s2存储商店有的不同颜色珠子的个数,然后比较就可以了。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
char a[maxn],b[maxn];
int s1[205],s2[205];
int main()
{
int flag=1,ans1=0,ans2=0;
scanf("%s%s",a,b);
for(int i=0;i<strlen(b);i++)
s1[b[i]]++;
for(int i=0;i<strlen(a);i++)
s2[a[i]]++;
for(int i=0;i<205;i++)
{
if(s1[i]>s2[i])
{
flag=0;
ans2+=s1[i]-s2[i];
}
else ans1+=s2[i]-s1[i];
}
if(flag)printf("Yes %d\n",ans1);
else printf("No %d\n",ans2);
return 0;
}
1093 Count PAT's(25)思维
【题意】
给一个字符串输出最多能构成多少PAT。
【解题思路】
这是一道思维题……暴力的话只能拿15分。只要记录对于每一个A,前面有多少个P,后面有多少个T,他们的乘积即是这个A能组成的PAT的个数,然后所有相加即是最终答案。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int mod=1000000007;
char s[maxn];
int main()
{
scanf("%s",s);
int len=strlen(s);
int ans=0,cntP=0,cntA=0,cntT=0;
for(int i=0;i<len;i++)
if(s[i]=='T')cntT++;
for(int i=0;i<len;i++)
{
if(s[i]=='P')cntP++;
else if(s[i]=='T')cntT--;
else if(s[i]=='A')ans=(ans+cntP%mod*cntT%mod)%mod;
}
printf("%d\n",ans);
return 0;
}
1094 The Largest Generation(25)dfs或bfs
【题意】
给一棵树,计算哪一层的结点数最多,并输出该结点数和所在层数。
【解题思路】
用dfs或bfs都可以,用book数组记录每一层的结点数。用bfs时,用level数组记录每个节点所在的层数。
【代码】
dfs:
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
vector<int>v[maxn];
int book[maxn];
void dfs(int x,int level)
{
book[level]++;
for(int i=0;i<v[x].size();i++)
dfs(v[x][i],level+1);
}
int main()
{
memset(book,0,sizeof(book));
int n,m;
scanf("%d%d",&n,&m);
while(m--)
{
int x,num,t;
scanf("%d%d",&x,&num);
while(num--)
{
scanf("%d",&t);
v[x].push_back(t);
}
}
dfs(1,1);
int ans=0,index=1;
for(int i=0;i<maxn;i++)
{
if(book[i]>ans)
{
ans=book[i];
index=i;
}
}
printf("%d %d\n",ans,index);
return 0;
}
bfs:
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
vector<int>v[maxn];
queue<int>q;
int level[maxn],book[maxn];
void bfs()
{
q.push(1);
level[1]=1;
while(!q.empty())
{
int t=q.front();
q.pop();
book[level[t]]++;
for(int i=0;i<v[t].size();i++)
{
level[v[t][i]]=level[t]+1;
q.push(v[t][i]);
}
}
}
int main()
{
memset(book,0,sizeof(book));
memset(level,0,sizeof(level));
int n,m;
scanf("%d%d",&n,&m);
while(m--)
{
int x,num;
scanf("%d%d",&x,&num);
while(num--)
{
int t;
scanf("%d",&t);
v[x].push_back(t);
}
}
bfs();
int ans=0,index=1;
for(int i=0;i<maxn;i++)
{
if(book[i]>ans)
{
ans=book[i];
index=i;
}
}
printf("%d %d\n",ans,index);
return 0;
}
1097 Deduplication on a Linked List(25)链表
【题意】
给一个链表,去重(去掉值或者绝对值相等的),先输出删除后的链表,再输出删除了的链表。
【解题思路】
用结构存储每个节点的信息,s1数组存储保留下的链表的信息,s2数组存储删除的链表的信息,用set记录每个key,当key在set中存在时则将该节点存入s2,否则则存入s1。注意最后输出时最后节点的next要改为-1,并且s2数组只有在cnt2>=1时才输出,不然会有一个测试点过不了。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct Node
{
int addr,key,next;
}node[maxn];
int s1[maxn],s2[maxn];
int main()
{
int head,n,cnt1=0,cnt2=0;
scanf("%d%d",&head,&n);
while(n--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
node[a].addr=a;node[a].key=b;node[a].next=c;
}
set<int>s;
while(head!=-1)
{
int t=abs(node[head].key);
if(!s.count(t))
{
s1[cnt1++]=node[head].addr;
s.insert(t);
}
else s2[cnt2++]=node[head].addr;
head=node[head].next;
}
for(int i=0;i<cnt1-1;i++)
printf("%05d %d %05d\n",s1[i],node[s1[i]].key,s1[i+1]);
printf("%05d %d -1\n",s1[cnt1-1],node[s1[cnt1-1]].key);
if(cnt2>=1)
{
for(int i=0;i<cnt2-1;i++)
printf("%05d %d %05d\n",s2[i],node[s2[i]].key,s2[i+1]);
printf("%05d %d -1\n",s2[cnt2-1],node[s2[cnt2-1]].key);
}
return 0;
}