题目地址: click here
第一次 做USACO的 silver。 感觉不出 铜银区难度的差距。。。
结果
CHN | 2016 | Tian Yanfei | 667 | * | * | * | * | t | t | t | t | t | t | * | * | * | * | * | * | * | * | * | * | * | t | * | * | t | t | t | * | * | * |
1,Auto-Complete View problem
给你 w个任意顺序的字符串,然后 n个询问, 问在这w个字典序排列的字符串中以str为头的 开始 第K_i个 字符串在 原来输入的顺序中的 次序。
先把w个字符串按照字典序排序,先记录每个字符串的次序, 然后 二分查找str开头的第一个字符串的位置,然后+K_i ,检测这个字符串是否是以str开头,如果是 输出它的原次序,否则输出-1. 开始做时就是因为不是使用二分查找 的 所以有超时的数据T_T ................
/*
ID: tyf19938
LANG: C++
TASK: auto
*/
#include
#include
#include
#include
#include
#include
这题 原来以为会TLE呢 , 最后过了... 题目说是给你 一个无向图,你可以求出他的最短路(1-->n), 然后你可以 把这个最短路的路径上的一条边的长度增加至原来的2倍, 这样会有一个新的 最短路, 问 新的最短路 比原来的最短路 差值 最大为多少。
spfa计算 1-->n 的最短路,同时记录路径,然后把这个路径上的边分别扩大至2倍,之后再求最短路, 计算差值求最大 即可。
/*
ID: tyf19938
LANG: C++
TASK: rblock
*/
#include
#include
#include
#include
#include
using namespace std;
#define INF 1000000000
#define N 255
#define M 25005
int n,m;
int inq[N],dis[N],mm[N][N],last[N],save[N],ad;
void init()
{
memset(last,-1,sizeof(last));
memset(inq,0,sizeof(inq));
for(int i=0;i<=n;i++) dis[i]=INF;
}
void spfa(int start)
{
queue q;
q.push(start);
dis[start]=0;
inq[start]=1;
last[start]=start;
while(!q.empty())
{
int u=q.front(); q.pop();
inq[u]--;
for(int v=1;v<=n;v++)
{
if(mm[u][v]<0) continue;
if(dis[v]>dis[u]+mm[v][u])
{
dis[v]=dis[u]+mm[v][u];
last[v]=u;
if(!inq[v])
{
q.push(v); inq[v]++;
}
}
}
}
}
int main()
{
freopen("rblock.in","r",stdin);
freopen("rblock.out","w",stdout);
int x,y,w;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(mm,-1,sizeof(mm));
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
mm[x][y]=mm[y][x]=w;
}
spfa(1);
ad=0;
int now=n;
while(now!=1)
{
save[++ad]=now;
now=last[now];
}
save[++ad]=1;
int len=dis[n],ma=-1;
for(int i=ad-1;i>=1;i--)
{
int xx,yy;
xx=save[i+1]; yy=save[i];
mm[xx][yy]*=2;
mm[yy][xx]*=2;
init();
spfa(1);
ma=max(ma,dis[n]);
mm[xx][yy]/=2;
mm[yy][xx]/=2;
}
printf("%d\n",ma-len);
}
return 0;
}
一个字符串可以 从左边去掉一部分,或则从右边去掉一部分(不可以全部去掉) 余下的部分 加到 原字符串的左边或者右边 这样 得到了一个新的字符串,题目求的是 给你一个字符串, 问可以 通过多少种方法 由某个字符串 经过 上述的 若干次操作得到 给定的字符串。(同一个 字符串通过不同的操作得到相同的字符串 , 这样是不同的操作方法)。
记忆化搜索可以 A掉, 当初超时 就是因为只有DFS没有记忆化, 重复搜索所以 TLE..
/*
ID: tyf19938
LANG: C++
TASK: scode
*/
#include
#include
#include
#include
#include
#include
#include