一、1419. 数青蛙
思路
这道题有俩种解法,一是记数,二是贪心
记数:
这是官方的题解
我们用frog_ num来表示现在正在发出蛙鸣声的青蛙数目,用cnt[c] 示已经发出-次有效蛙鸣中的字符c的青蛙个数,比如当cnt['c'] = 2时表示当前有2只青蛙已经发出了有效蛙鸣中的字符‘c’,下-个要发出学符r'。那么我们遍历字符串croakOfFrogs来模拟青蛙蛙鸣,现在记遍历到的字符为c,有:
1.若c='c',则需要-只青蛙开始发出蛙鸣,有fog_ num= fog_ num+ 1, cnt{'c']= cnt'c']+ 1。
2.则我们记prec为-次有效蛙鸣中该字符c的前一个字符
3.若当前cnt[prec]= 0,即没有青蛙可以发出字符c,直接返回-1。
4.否则cntprec] = cntprec]- 1, cnt[c]= cnt[c] +1。 哨c=k'时,说明一只青蛙完成了完
5.整的- -次蛙鸣,此时正在发出蛙鸣声的青蛙数目减- -,有: fog. num= fog_ num- 1。
若遍历完还有正在发出蛙鸣的青蛙,即fog_ num > 0,说明croakOfFrogs 不是被若干有效的蛙鸣混合而成,直接返回- 1。 否则我们只要返回在遍历的过程中正在发出蛙鸣的青蛙数目的最大值即可。
贪心:
这里有大佬的图片
代码实现
记数:
int minNumberOfFrogs(char * croakOfFrogs){
int len=strlen(croakOfFrogs);
if(len%5!=0)return -1;
int res=0,num=0;
int cnt[4],map[26];
memset(cnt,0,sizeof(cnt));
map['c'-'a']=0;
map['r'-'a']=1;
map['o'-'a']=2;
map['a'-'a']=3;
map['k'-'a']=4;
for(int i=0;i<len;i++)
{
char c=croakOfFrogs[i];
int t=map[c-'a'];
if(t==0)
{
cnt[t]++;
num++;
if(num>res)res=num;
}
else
{
if(cnt[t-1]==0)return -1;
cnt[t-1]--;
if(t==4)num--;
else cnt[t]++;
}
}
if(num>0)return -1;
return res;
}
贪心
int minNumberOfFrogs(char * croakOfFrogs){
int len=strlen(croakOfFrogs);
int cnt[5]={0};
for(int i=0;i<len;i++)
{
switch(croakOfFrogs[i])
{
case 'c':
if(cnt[4])cnt[4]--;
cnt[0]++;
break;
case 'r':
if(cnt[0])
{
cnt[0]--;
cnt[1]++;
}
else return -1;
break;
case 'o':
if(cnt[1])
{
cnt[1]--;
cnt[2]++;
}
else return -1;
break;
case 'a':
if(cnt[2])
{
cnt[2]--;
cnt[3]++;
}
else return -1;
break;
case 'k':
if(cnt[3])
{
cnt[3]--;
cnt[4]++;
}
else return -1;
break;
}
}
if(cnt[0]==0&&cnt[1]==0&&cnt[2]==0&&cnt[3]==0)return cnt[4];
else return -1;
}
二、[USACO10FEB]Chocolate Giving S
思路
这道题是一道最短路劲的问题,虽然当时做的时候读懂题意花了很久,但是细想的话就很简单,就它就是多了一道要从a去b的时候还要必须经过一个点1,这样可以分成俩段路径,一种是1到a点的最短路径,一种是1到b点的最短路径,这样做就很简单了
要注意一点的是,这题不能用邻接矩阵来做,要用链式前向星或者邻接表来做,否则会爆掉
代码实现
#include<stdio.h>
#include<string.h>
#define inf 100001
int dis[50001], book[50001], x[50001][50001];
int n, m, b, sum = 0;
int dijkstra(int from, int to)
{
int i,pos;
for (i = 1; i <= n; i++) //初始化
{
book[i] = 0;
dis[i] = x[from][i];
}
book[from]=1;
for (i = 1; i < n; i++)
{
int min = inf;
for (int j = 1; j <= n; j++)
{
if (book[j] == 0 && min > dis[j])
{
min = dis[j];
pos = j;
}
}
book[pos] = 1;
for (int j = 1; j <= n; j++)
{
if (book[j] == 0 && dis[j] > dis[pos] + x[pos][j])
dis[j] = dis[pos] + x[pos][j];
}
}
return dis[to];
}
int main()
{
scanf("%d %d %d", &n, &m, &b);
for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)x[i][j] = inf;
while (m--)
{
int r, s, t;
scanf("%d %d %d", &r, &s, &t);
x[r][s] = t;
x[s][r] = t;
}
while (b--)
{
int r, s;
scanf("%d %d", &r, &s);
if(s==1)sum=dijkstra(r,s);
else sum = dijkstra(r, 1) + dijkstra(1,s);
printf("%d\n", sum);
}
return 0;
}