I.求逆元
欧几里得方法

II.模拟
细心+耐心

*本人感悟:
自己的错误在于:
对于这道模拟题没有耐心静下来一字一字看题,一行一行调错,一步一步调试,我要引以为戒。

III.dp
f[i][j][k]=max(f[i-1][j][k],min(f[i-1][t][k-1])+value[i][k])
t=0,1,…,801

i为第i个曲子(长度为3)
j为至今已进行j次的和弦改变(j<=c(c为允许和弦改变的最多次数))
k为第k种和弦的方法
value[i][k]为用对第i个曲子用第k个和弦的不和谐值

本人想到的进一步优化(本题不用):
1.求出全程不能变音的最小值

2.对于某个变音方法,如果其值已经大于最小值,则该方法不能继续进行下去

具体操作:
把对应第1~i个曲子可以实现的和弦存放到数组,生成第1~i+1个曲子可以实现的和弦

时间复杂度:
i<=1000
j<=20
k<=802

对于每个i,k,求出一次min(f[i-1][t][k-1])即可

O(nk*802)
1000*20*802=16040000
可在一秒内解决

*另:注意数组维数的范围
如发现错误,可在各个位置设置“输出一个数”,看哪里不正常,那么就是哪里出错了

*测试数据:
如n=1000,k=20
其它全为0
判断是否数组开的正确

IV.
实际上,没多少斤两就不要想第四题了,看看题目和测试数据就知道是不想让你用简单方法拿点分了

反正不会做
下面是想法:

不同的分图没有边相连,不互相影响,可分开考虑

以k个点为标准点,分别考虑这k个点是否发生故障,除去??? 不行,2^k 太大了

有第i个点和有第j点,

当某边在/不在时

当某点在/不在时

当n很大时

当m很大时

极限数据:
100000个点,编号为前400的点,每个点之间都有一个边相连;剩下的点都仅与编号为1的点相连

1.

 #include <stdio.h>
#include <stdlib.h> long s,t; void gcd(long x,long y)
{
if (y==)
{
s=;
t=;
return;
}
long r,q;
r=x/y;
gcd(y,x%y);
q=s;
s=t;
t=q-r*t;
} int main()
{
long a,b,p;
scanf("%ld%ld%ld",&a,&b,&p);
b=b%p;
gcd(p,b);
t=t%p+p;
printf("%ld\n",a*t%p);
return ;
}

2.

 #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h> struct node
{
long f[];
long a[];
}pai[]; long n; bool judge()
{
long j,k,g;
//
for (j=;j<;j++)
{
g=;
for (k=;k<n;k++)
g+=pai[k].f[j];
if (g==)
return true;
}
//
for (j=;j<n;j++)
if (pai[j].a[]>)
break;
if (j!=n)
{
for (j=;j<n;j++)
if (pai[j].f[]+pai[j].f[]+pai[j].f[]+pai[j].f[]>)
break;
if (j!=n)
{
for (j=;j<n;j++)
if (pai[j].f[]>)
break;
if (j==n)
return true;
}
}
//
for (j=;j<n;j++)
if (pai[j].a[]>)
break;
if (j!=n)
{
for (j=;j<n;j++)
if (pai[j].f[]+pai[j].f[]+pai[j].f[]+pai[j].f[]>)
break;
if (j!=n)
{
for (j=;j<n;j++)
if (pai[j].f[]>)
break;
if (j==n)
return true;
}
}
//
for (j=;j<n;j++)
if (pai[j].a[]>)
break;
if (j!=n)
{
for (j=;j<n;j++)
if (pai[j].f[]+pai[j].f[]+pai[j].f[]+pai[j].f[]>)
break;
if (j!=n)
return true;
}
return false;
} int main()
{
long c,g,t,i,j,k,sum[],tot[],num;
char s[];
scanf("%ld%ld",&n,&c);
for (i=;i<n;i++)
sum[i]=;
for (i=;i<n;i++)
tot[i]=;
num=;
for (i=;i<=c;i++)
{
scanf("%s",s);
if (strcmp(s,"Fruit")==)
{
tot[num]++;
sum[num]--;
for (j=;j<;j++)
pai[num].f[j]=;
for (j=;j<;j++)
pai[num].a[j]=;
scanf("%ld",&g);
for (j=;j<=g;j++)
{
scanf("%ld",&t);
pai[num].f[t]++;
}
num=(num+)%n;
}
else if (strcmp(s,"Animal")==)
{
tot[num]++;
sum[num]--;
for (j=;j<;j++)
pai[num].f[j]=;
for (j=;j<;j++)
pai[num].a[j]=;
scanf("%ld",&t);
pai[num].a[t]=;
num=(num+)%n;
}
else
{
scanf("%ld",&t);
if (judge()==true)
{
for (j=;j<n;j++)
sum[t]+=tot[j];
for (j=;j<n;j++)
{
tot[j]=;
for (k=;k<;k++)
pai[j].f[k]=;
for (k=;k<;k++)
pai[j].a[k]=;
}
}
else
{
sum[t]-=n;
for (j=;j<n;j++)
sum[j]++;
}
num=t;
}
//printf("%ld %ld %ld\n",sum[0],sum[1],sum[2]);
}
for (i=;i<n;i++)
printf("%ld\n",sum[i]);
return ;
}

3.

 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define maxf 10000000
//max=400*3000=1200000 long music[],value[][],f[][][],ch[]; long min(long a,long b)
{
if (a>b)
return b;
else
return a;
} int main()
{
long n,g,i,j,k,l,m,pr;
scanf("%ld%ld",&n,&g);
for (i=;i<=*n;i++)
scanf("%ld",&music[i]);
for (i=;i<=;i++)
{
j=i-;
l=;
m=;
for (k=;k<=n;k++)
{
m++;
value[m][i]=;
l++;
value[m][i]+=abs(j-music[l]);
l++;
value[m][i]+=abs(j+-music[l]);
l++;
value[m][i]+=abs(j+-music[l]);
}
} for (i=;i<=;i++)
{
j=i-;
l=;
m=;
for (k=;k<=n;k++)
{
m++;
value[m][i]=;
l++;
value[m][i]+=abs(j-music[l]);
l++;
value[m][i]+=abs(j+-music[l]);
l++;
value[m][i]+=abs(j+-music[l]);
}
} for (i=;i<=n;i++)
for (j=;j<=g;j++)
for (k=;k<;k++)
f[i][j][k]=maxf; for (k=;k<;k++)
f[][][k]=;
for (i=;i<=n;i++)
for (k=;k<;k++)
f[i][][k]=f[i-][][k]+value[i][k]; pr=maxf;
//
for (i=;i<=n;i++)
{
//0 <g
for (j=;j<min(i-,g);j++)
{
ch[j]=maxf;
for (k=;k<;k++)
ch[j]=min(ch[j],f[i-][j][k]);
}
//1(0 不用计算)
for (j=;j<=min(i-,g);j++)
{
for (k=;k<;k++)
{
f[i][j][k]=f[i-][j][k]+value[i][k];
if (j!=)
f[i][j][k]=min(f[i][j][k],ch[j-]+value[i][k]);
}
}
} for (j=;j<=g;j++)
for (k=;k<;k++)
pr=min(pr,f[n][j][k]); printf("%ld\n",pr);
return ;
}

by lzu_cgb
share & spread ideas

hiho_offer收割18_题解报告_差第四题的更多相关文章

  1. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  2. cojs 强连通图计数1-2 题解报告

    OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...

  3. cojs 二分图计数问题1-3 题解报告

    OwO 良心的FFT练手题,包含了所有的多项式基本运算呢 其中一部分解法参考了myy的uoj的blog 二分图计数 1: 实际是求所有图的二分图染色方案和 我们不妨枚举这个图中有多少个黑点 在n个点中 ...

  4. 题解报告:hdu 1398 Square Coins(母函数或dp)

    Problem Description People in Silverland use square coins. Not only they have square shapes but also ...

  5. 题解报告:hdu 2069 Coin Change(暴力orDP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ...

  6. 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)

    Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...

  7. CF Educational Round 78 (Div2)题解报告A~E

    CF Educational Round 78 (Div2)题解报告A~E A:Two Rival Students​ 依题意模拟即可 #include<bits/stdc++.h> us ...

  8. CF1169(div2)题解报告

    CF1169(div2)题解报告 A 不管 B 首先可以证明,如果存在解 其中必定有一个数的出现次数大于等于\(\frac{m}{2}\) 暴力枚举所有出现次数大于等于$\frac{m}{2} $的数 ...

  9. CFEducational Codeforces Round 66题解报告

    CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...

随机推荐

  1. 11.8 开课二个月零四天 (Jquery)

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

  2. CentOS7永久挂载硬盘

    刚新装一台服务器,有一块120G的SSD和一块1T的HHD,把cenos7装在了SSD上,进系统默认是找不到HHD的,现需要将其挂载上去. 1.先查看服务器的硬件信息 # fdisk -l 可以看到如 ...

  3. ECMAScript6——异步操作之Promise

    Promise对象的参数为一个回调函数,这个回调函数有两个参数,分别是resolve, reject(这俩参数的名字可任取),resolve,reject分别表示异步操作执行成功后的回调函数和异步操作 ...

  4. JavaScript快速入门-ECMAScript本地对象(Number)

    Number 对象是原始数值的包装对象. 创建一个Number对象:var myNum=new Number(value); 注意: 1.参数 value 是要创建的 Number 对象的数值,或是要 ...

  5. js 二进制操作

    //二进制保存var content = "file content!"; var data = new Blob([content],{type:"text/plain ...

  6. 强化学习算法DQN

    1 DQN的引入 由于q_learning算法是一直更新一张q_table,在场景复杂的情况下,q_table就会大到内存处理的极限,而且在当时深度学习的火热,有人就会想到能不能将从深度学习中借鉴方法 ...

  7. PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题

    题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 # ...

  8. PAT甲题题解-1053. Path of Equal Weight (30)-dfs

    由于最后输出的路径排序是降序输出,相当于dfs的时候应该先遍历w最大的子节点. 链式前向星的遍历是从最后add的子节点开始,最后添加的应该是w最大的子节点, 因此建树的时候先对child按w从小到大排 ...

  9. 【MOOC EXP】Linux内核分析实验一报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [反汇编一个简单的C程序]   实验 ...

  10. 第三周:构造一个简单的LINUX系统MENUOS

    吕松鸿 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...