更正:第三组:不存在相同的字符|str|=26,26<=n<=100

60

/*
呵呵哒~这题
正解还在研究....
因为没有题解只有个std还在看
不过乱搞一下可以70(数据好像有问题只有60)
首先一个字母的不说了
n<=5的暴力 不过吧 卡纯暴力
+个小小的剪枝就是只找危险串的前len-1位
最后一位枚举的时候判一下 这样能快一点
另外%30没有重复的串的话dp一下
f[i]表示前i位的方案数 先不考虑不合法的
那就是26^i 再减去f[i-len]就是说除了那len位危险的
剩下的有几种
正解好像巧妙用fail数组+位数dp
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 1000000007
#define ll long long
using namespace std;
ll n,len,f[];
char s[],D[];
bool vis[];
long long ans;
void Dfs(int step)
{
if(step==n+){
ans++;
if(ans>=mod) ans%=mod;
}
else{
bool flag=(step<len-)||(!equal(s+step-len+,s+step,D));
for(char x='a'; x<='z'; x++){
if(!flag&&x==D[len-]) continue;
s[step]=x;Dfs(step+);
}
}
}
void Solve(){
if(n==)ans=;
else Dfs();
cout<<ans<<endl;
}
void DP(){
memset(f,,sizeof(f));
f[]=;
for(int i=;i<=n;i++){
f[i]=f[i-]*%mod;
if(i>=len)f[i]=((f[i]-f[i-len])%mod+mod)%mod;
}
cout<<f[n]<<endl;
}
int main()
{
freopen("helloworld.in","r",stdin);
freopen("helloworld.out","w",stdout);
while(cin>>n){
scanf("%s",D);len=strlen(D);
ans=;memset(vis,,sizeof(vis));
int sum=;
if(n<=){
Solve();continue;
}
for(int i=;i<len;i++){
if(vis[D[i]-'a']==)sum++;
vis[D[i]-'a']=;
}
if(sum==len){
DP();continue;
}
if(len==){
ans++;
for(int i=;i<=n;i++)ans=ans*%mod;
cout<<ans<<endl;continue;
}
}
return ;
}

更正:输出的顺序保证a<b

更正:输出样例:0 1000000006

/*读错题目 把a+b的min输出来了QAQ*/
#include<iostream>
#include<cstdio>
#define mod 1000000007
#define ll long long
using namespace std;
ll k,a[][],f[][];
void mul(ll a[][],ll b[][]){
ll c[][];c[][]=c[][]=c[][]=c[][]=;
for(ll i=;i<;i++)
for(ll j=;j<;j++)
for(ll k=;k<;k++)
c[i][j]=(c[i][j]+a[i][k]*b[k][j]%mod)%mod;
for(ll i=;i<;i++)
for(ll j=;j<;j++)
a[i][j]=c[i][j];
}
int main()
{
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
cin>>k;
if(k==){
cout<<"1 1"<<endl;
return ;
}
a[][]=a[][]=a[][]=;
f[][]=;f[][]=;
k-=;
while(k){
if(k&)mul(f,a);
k>>=;mul(a,a);
}
cout<<f[][]<<" "<<f[][]<<endl;
return ;
}

更正:模数1000000007

50

/*
乱搞...
不会统计方案数 0...0
用匈牙利搞一下P==1的情况
还有几个点是暴力的 这样可以50分
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
#define mod 1000000007
using namespace std;
int T,P,n,head[maxn],num,f[maxn],match[maxn],ans,sum,C[maxn];
struct node{
int v,pre;
}e[maxn*];
struct edge{
int u,v;
}c[maxn];
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
int Dfs(int u){
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;
if(f[v])continue;f[v]=;
if(match[v]==||Dfs(match[v])){
match[v]=u;return ;
}
}
return ;
}
void Mx(){
for(int i=;i<=n;i++)if(C[i]){
memset(f,,sizeof(f));
ans+=Dfs(i);
}
if(P==)printf("%d\n",ans);
if(P==)printf("%d 1\n",ans);
}
void dfs(int now,int s){
if(now==n){
if(s>ans){
ans=s;sum=;
}
else if(s==ans)sum++,sum%=mod;
return;
}
if(f[c[now].u]==&&f[c[now].v]==){
f[c[now].u]=;f[c[now].v]=;
dfs(now+,s+);
f[c[now].u]=;f[c[now].v]=;
}
dfs(now+,s);
}
void Mxx(){
dfs(,);
printf("%d %d\n",ans,sum);
}
void Go(int now,int from){
C[now]=!C[from];
for(int i=head[now];i;i=e[i].pre){
int v=e[i].v;
if(v!=from)Go(v,now);
}
}
int main()
{
freopen("hungary.in","r",stdin);
freopen("hungary.out","w",stdout);
scanf("%d%d",&T,&P);
while(T--){
num=;ans=;sum=;
memset(f,,sizeof(f));
memset(head,,sizeof(head));
memset(match,,sizeof(match));
scanf("%d",&n);
int u,v;
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
Add(u,v);Add(v,u);
c[i].u=u;c[i].v=v;
}
Go(,);
if(P==||n>=){Mx();continue;}
if(P==){Mxx();continue;}
}
return ;
}

100

/*
正解树形dp
忽略的他是棵 树 树 树.....
f[i][0 1]表示有没有连i的儿子
然后顺便统计方案数....
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 100010
#define mod 1000000007
#define ll long long
using namespace std;
ll T,P,n,head[maxn],num,f[maxn][],g[maxn][],L,R[maxn],l,r[maxn],son[maxn];
struct node{
ll v,pre;
}e[maxn*];
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Add(ll from,ll to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Clear(){
num=;
memset(f,,sizeof(f));
memset(g,,sizeof(g));
memset(head,,sizeof(head));
}
void DP(ll now,ll from){
g[now][]=;
ll mx,sum;
for(int i=head[now];i;i=e[i].pre){
ll v=e[i].v;
if(v==from)continue;
DP(v,now);//x不连儿子 儿子们可连可不连
mx=max(f[v][],f[v][]);sum=;
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
g[now][]=g[now][]*sum%mod;
f[now][]+=mx;
}
//x连某个儿子 这个不选 其他的连或者不连
L=;l=;ll S=;
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)son[++S]=e[i].v;
R[S+]=;r[S+]=;
for(int i=S;i>=;i--){
ll v=son[i];sum=;
mx=max(f[v][],f[v][]);
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
R[i]=R[i+]+mx;
r[i]=r[i+]*sum%mod;
}
for(int i=;i<=S;i++){
ll v=son[i];
mx=L+f[v][]+R[i+]+;
if(mx>f[now][]){
f[now][]=mx;
g[now][]=l*g[v][]%mod*r[i+]%mod;
}
else if(mx==f[now][])
g[now][]=(g[now][]+l*g[v][]%mod*r[i+]%mod)%mod;
sum=;
mx=max(f[v][],f[v][]);
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
l=l*sum%mod;L+=mx;
}
}
int main()
{
freopen("hungary.in","r",stdin);
freopen("hungary.out","w",stdout);
T=init();P=init();
while(T--){
n=init();
ll u,v;Clear();
for(int i=;i<n;i++){
u=init();v=init();
Add(u,v);Add(v,u);
}
DP(,);ll sum,mx;
mx=max(f[][],f[][]);sum=;
if(mx==f[][])sum+=g[][],sum%=mod;
if(mx==f[][])sum+=g[][],sum%=mod;
if(P==)cout<<mx<<endl;
if(P==)cout<<mx<<" "<<sum<<endl;
}
return ;
}

60

/*
正解还在看....这尼玛考试不发题解不讲解
就给个std看啊看看啊看 蒟蒻表示压力很大啊
这题乱搞的 有bug 似乎改不了了....
60
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 210
#define inf 1000000000
using namespace std;
int n,m;
double g[maxn][maxn],ans=inf;
struct node{
int u,v;
double t;
}e[maxn*];
void Floyed(){
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(g[i][k]+g[k][j]<g[i][j])
g[i][j]=g[i][k]+g[k][j];
}
void Solve(){
for(int k=;k<=m;k++){
int u=e[k].u,v=e[k].v;
double t=e[k].t;
double r1=,r2=;
for(int i=;i<=n;i++){
if(g[i][u]>g[i][v]){
if(r1<g[i][v])r1=g[i][v];
}
if(g[i][u]<g[i][v]){
if(r2<g[i][u])r2=g[i][u];
}
if(g[i][u]==g[i][v]){
double tmp=g[i][u];
if(r1<r2&&r2<tmp)r2=tmp;
if(r1>r2&&r1<tmp)r1=tmp;
}
}
double r=r1+r2+t;r=r/2.0;
double R;
if(r>=r1&&r<=r1+t)R=r;
else if(r<r1)R=r1;
else R=r2;
if(R<ans)ans=R;
}
}
int main()
{
freopen("radius.in","r",stdin);
freopen("radius.out","w",stdout);
scanf("%d%d",&n,&m);
int u,v;double t;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
g[i][j]=inf;
for(int i=;i<=m;i++){
scanf("%d%d%lf",&u,&v,&t);
if(t<g[u][v])g[u][v]=t;
if(t<g[v][u])g[v][u]=t;
e[i].u=u;e[i].v=v;e[i].t=t;
}
for(int i=;i<=n;i++)g[i][i]=;
Floyed();Solve();
printf("%.2f\n",ans);
return ;
}

10.6 noip模拟试题的更多相关文章

  1. 10.26 noip模拟试题

    enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...

  2. 10.27 noip模拟试题

    1.铺瓷砖(tile.cpp/c/pas)[问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行 ...

  3. 10.24 noip模拟试题

    尼玛pdf依旧不会粘23333 /* 每段合并到总的里面 假设总的有X个 这一段有Y个 一共有X+1个空 那么就有 C(X+1,1)+C(X+1,2)+C(X+1,3)+...+C(X+1,Y) 这样 ...

  4. 10.18 noip模拟试题

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  5. 10.13 noip模拟试题

    Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship ...

  6. 10.11 noip模拟试题

    4题均为128M,1s 1. 锻炼计划(exercise.pas) 身体是革命的本钱,OIers不要因为紧张的学习和整天在电脑前而忽视了健康问题.小x设计了自己的锻炼计划,但他不知道这个计划是否可行, ...

  7. 10.8 noip模拟试题

      1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的 ...

  8. 10.4 noip模拟试题

    题目名称 PA 青春 三部曲 名称 huakai taritari truetears 输入 huakai.in taritari.in truetears.in 输出 huakai.out tari ...

  9. 10.3 noip模拟试题

    希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“ ...

  10. 10.25 noip模拟试题

    今天题目略水2333 依旧不粘题目了23333 T1 /*数学题 给定n个斜率 求有多少个三元组 保证两两斜率不同 ans=C(n,3)-ΣC(len[i],2)*(n-len[i])-ΣC(len[ ...

随机推荐

  1. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  2. [转]hive中order by,distribute by,sort by,cluster by

    转至http://my.oschina.net/repine/blog/296562 order by,distribute by,sort by,cluster by  查询使用说明 1 2 3 4 ...

  3. [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】

    题目链接:BZOJ - 3564 题目分析 求最小椭圆覆盖,题目给定了椭圆的长轴与 x 轴正方向的夹角,给定了椭圆长轴与短轴的比值. 那么先将所有点旋转一个角度,使椭圆长轴与 x 轴平行,再将所有点的 ...

  4. touchend与click顺序

    http://www.w3cmm.com/javascript/touch.html click 在 touchend之前 去除超链接的虚线框 http://www.cnblogs.com/kingw ...

  5. Windows窗口样式速查参考,Delphi窗口控件的风格都有它们来决定(附Delphi何时用到它们,并举例说明)good

    /* 窗口样式参考列表(都是GetWindowLong的GWL_STYLE风格,都是TCreateParams.Sytle的一部分),详细列表如下:https://msdn.microsoft.com ...

  6. ServletContextListener作用(转)

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...

  7. 【HDOJ】1811 Rank of Tetris

    并查集+拓扑排序.使用并查集解决a = b的情况. #include <iostream> #include <cstdio> #include <cstring> ...

  8. 【HDOJ】1501 Zipper

    DFS.注意剪枝,0ms. #include <stdio.h> #include <string.h> #define False 0 #define True 1 #def ...

  9. Spring - Web MVC简介

    Web MVC简介 1.1.Web开发中的请求-响应模型: 在Web世界里,具体步骤如下: 1.  Web浏览器(如IE)发起请求,如访问http://www.cnblogs.com 2.  Web服 ...

  10. web.xml中的contextConfigLocation的作用

    在web.xml中通过contextConfigLocation配置spring,contextConfigLocation 参数定义了要装入的 Spring 配置文件. 如果想装入多个配置文件,可以 ...