更正:第三组:不存在相同的字符|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. AVR GCC对端口的操作指南

    1. AVR GCC for AVR I.I/O端口API1. BV用法:BV(pos);说明:将位定义转换成屏蔽码(MASK).与头文件io.h里的位定义一起使用.例如,置位WDTOE和WDE可表示 ...

  2. bzoj 3626: [LNOI2014]LCA 离线+树链剖分

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 426  Solved: 124[Submit][Status] ...

  3. [BZOJ 3282] Tree 【LCT】

    题目链接:BZOJ - 3282 题目分析 这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息. 写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x] ...

  4. jQuery zxxbox弹出框插件(v3.0)

    插件地址: http://www.zhangxinxu.com/study/201009/jquery-zxxbox-v3-demo.html

  5. 【转】SendMessage及WPRAME、LPARAME

    原文网址:http://www.cnblogs.com/renyuan/archive/2012/11/26/2789103.html SendMessage及WPRAME.LPARAME typed ...

  6. TimePicker,TimePickerDialog以及自定义timepicker(一)

    场景:在activity上点击,弹出一个dialog,然后点击dialog上的一个按钮,在弹出时间.以及自定义dialog 懒,要用到一个选择时间的需求,只要求小时和分钟,弹出式,第一时间想到了tim ...

  7. Linux学习笔记6——映射虚拟内存

    使用到两个函数mmap:用于分配内存:munmap:用于释放内存. mmap的原型如下: void *mmap(    void *start,   //指定映射的虚拟地址 0由系统指定开始位置    ...

  8. C++中关于const的思考

    在学习C++的过程中,经常被什么时候使用const.为什么使用const以及怎么使用const关键字这样的问题所困扰,以下是我对const的使用总结. 1.值替代 使用#define的确单缺点,第一: ...

  9. java基础(十二)常用类总结(二)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  10. Android学习笔记(二)Manifest文件节点详解

    在上一篇博文中简单介绍了Manifest文件及其存放位置,本篇就来详细介绍一下Manifest文件中的节点和一些节点的基本作用,首先看一下Manifest文件最基本的结构: <manifest ...