更正:第三组:不存在相同的字符|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. ZeroBraneStudio之支持远程调试

    打开ZBS后,如果需要远程调试得先开启调试服务器:Project->Start Debugger Server 打开之后就可以编辑文件进行测试了.示例代码如下: local ZBS = 'D:/ ...

  2. LightOJ_1248 Dice (III)

    题目链接 题意: 给一个质地均匀的n的骰子, 求投掷出所有点数至少一次的期望次数. 思路: 这就是一个经典的邮票收集问题(Coupon Collector Problem). 投掷出第一个未出现的点数 ...

  3. javascript学习代码--点击按钮显示内容

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Git命令详解

    一个中文git手册:http://progit.org/book/zh/ 原文:http://blog.csdn.net/sunboy_2050/article/details/7529841 前面两 ...

  5. Git的分支与合并

    在Git里面我们可以创建不同的分支,来进行调试.发布.维护等不同工作,而互不干扰.下面我们还是来创建一个试验仓库,看一下Git分支运作的台前幕后: $rm -rf test_branch_proj $ ...

  6. Scanner 与 Readable 的read()方法

    Readable接口中的read()方法实现了将字符串读入charBuffer中,但是只有在需要输出的时候才会调用. Scanner是文本扫描器类,利用Scanner扫描并输出charBuffer中的 ...

  7. 【HDOJ】1728 逃离迷宫

    题目大坑,注意行列顺序式反的,另外注意起点和终点相同. #include <iostream> #include <cstdio> #include <cstring&g ...

  8. 谷歌浏览器怎么调试js

    首先我们打开开发者工具,你可以直接在页面上点击右键,然后选择审查元素或者在Chrome的工具中找到或者你直接记住这个快捷方式: Ctrl+Shift+I (或者Ctrl+Shift+J直接打开控制台) ...

  9. HDU-4927 Series 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4927 同学用java写的大整数相减 Series 1 Time Limit: 2000/1000 MS (Jav ...

  10. Anjuta 调试无输出 warning: GDB: Failed to set controlling terminal

    调试无输出,起初以为是那个warning的问题,后来才知道这个系统printf直到遇到'\n'换行符才输出,VC6用习惯了没想到还有这样的,网上说这样是节省系统资源. 那个warning暂时还没看到影 ...