USACO 2014 February Contest, Silver

题目地址: 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
#include
using namespace std;
#define INF 1000000000
#define N 10005
string str[1000005],str2;
int num;
map  word;
int w,n;
int main()
{
    freopen("auto.in","r",stdin);
    freopen("auto.out","w",stdout);
    while(scanf("%d%d",&w,&n)!=EOF)
    {
        for(int i=1; i<=w; i++)
        {
            cin>>str[i];
            word[str[i]]=i;
        }
        std::sort(str+1,str+w+1);
        /*for(int i=1;i<=w;i++)
	   {
	   	printf("%d ",i);
		cout<>str2;
            int ll=str2.length();
            int le=1,ri=w,mid;
            while(le+1>1;
		  	if(str[mid]w)  printf("-1\n");
		  else
		  {
		  	if(str2==str[now].substr(0,ll)) printf("%d\n",word[str[now]]);
		  	else printf("-1\n");
		  }

        }
    }
    return 0;
}

2,  Roadblock  View problem 

  这题 原来以为会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;
}

3, Secret Code  View problem

一个字符串可以 从左边去掉一部分,或则从右边去掉一部分(不可以全部去掉) 余下的部分 加到 原字符串的左边或者右边 这样 得到了一个新的字符串,题目求的是 给你一个字符串, 问可以 通过多少种方法 由某个字符串 经过 上述的 若干次操作得到 给定的字符串。(同一个 字符串通过不同的操作得到相同的字符串  , 这样是不同的操作方法)。

  记忆化搜索可以 A掉,  当初超时 就是因为只有DFS没有记忆化, 重复搜索所以 TLE..

/*
ID: tyf19938
LANG: C++
TASK: scode
*/
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define INF 1000000000
#define N 10005
map save;
string str;
int cou;
void dfs(string s)
{
    //cout<=a2;i--)
    {
        string s1=s.substr(i,len);//shao
        string s2=s.substr(0,i);//duo
        string s22=s.substr(0,i);
        string ss2=s2.substr(0,len-i);
        string ss22=s22.substr(i-len+i,i);
        if(s1==ss2)
        {
            cou++;cou%=2014; dfs(s2);
        }
        if(s1==ss22)
        {
            cou++;cou%=2014; dfs(s22);
        }
    }
    save[s]=(2014+cou-now)%2014;
}
int main()
{
	freopen("scode.in","r",stdin);
	freopen("scode.out","w",stdout);
	cin>>str;
	cou=0;
	dfs(str);
	printf("%d\n",cou);

	return 0;
}


你可能感兴趣的:(USACO)