更正:第三组:不存在相同的字符|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. iOS MD5加密算法

    考虑到用户账户安全,对用户的登录密码进行MD5加密 什么是MD5加密呢...懒了就不在这搬砖了,大家可以自己搜索查查,在此记录下代码,以供以后学习查询! 下面,直接上代码... // 需要倒入这个头文 ...

  2. asp.net学习

    http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html

  3. 写个自动安装JDK的shell脚本

    #!/bin/bash ################################################# # # INSTALL JDK AUTOMATICALLY # # auth ...

  4. 【HDU4859】 海岸线(网络流-最小割)

    Problem Description 欢迎来到珠海! 由于土地资源越来越紧张,使得许多海滨城市都只能依靠填海来扩展市区以求发展.作为Z市的决策人,在仔细观察了Z市地图之后,你准备通过填充某些海域来扩 ...

  5. quartz定时任务时间配置

    quartz定时任务时间设置描述(2011-03-03 16:23:50)转载▼标签: quartz时间it 分类: 凌乱小记  这些星号由左到右按顺序代表 :     *    *     *    ...

  6. QImage与QPixmap加载图片效果(QImage不能拉伸图片,QPixmap默认拉伸图片)

    QImage与QPixmap加载图片 效果 . 分类: QT开发 qtQtQT PixmapTest::PixmapTest(QWidget *parent) : QDialog(parent) {t ...

  7. 【HDOJ】2988 Dark roads

    最小生成树. /* */ #include <iostream> #include <string> #include <map> #include <que ...

  8. -_-#【邮件】qq邮箱不显示图片

    干货分享之邮件营销QQ邮箱IP白名单服务申请

  9. Java-Iterator的用法

    迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...

  10. Linux给用户增加sudo权限

    有时候我们在Linux下执行sudo的时候,出现 xxx is not int the sudoers file 告诉我们当前用户不是sudoer,所以我们要把当前用户添加进去,步骤如下: 1.进入超 ...