写在前面 : 这个算是个破烂集叭,没什么参考的意义,单纯的写给自己。因为即使很简单的题,也会有一些错误的发生,同事抱着不想因小失大的想法,将这些错误记录下来,免得日后再发生。(日后一定会再发生(大雾)
1: 一道简单的dp, 要求求出一个序列中的最大子段和,我们定义dp[i]为以i结尾的最大子段和,列出转移方程即可。
#include
#include
#include
using namespace std;
const int maxn = 1e5 + 9;
int a[maxn],dp[maxn];
int main()
{
int K;
scanf("%d",&K);
for(int i = 0;i < K;i++)
{
scanf("%d",&a[i]);
}
dp[0] = a[0];
for(int i = 1;i < K;i++)
{
dp[i] = max(dp[i-1] + a[i],a[i]);
}
int maxx = 0;
for(int i = 0;i < K;i++)
{
maxx = max(maxx ,dp[ i ]);
}
printf("%d\n",maxx);
return 0;
}
2:一元多项式的加法与乘法
真的是一道很没有思维水平的模拟题,但是我却写了好长时间(主要是debug),再一次反映了自己代码水平不过关的残忍事实qwq。不过这原生代码虽然看起来长,但是比网上千篇一律的解法要更省空间(不得不吐槽做完之后看了10篇blog都是一模一样的解法,俺佛了)。
怎么说呢:要注意模拟题在写之前就要尽量考虑好所有的情况,不然最后debug仿佛补补丁,使得代码可读性特别差。
不知道这一题是不是用链表写会更简单,但是我选择了我用的更熟练的数组qwq
#include
#include
using namespace std;
const int maxn = 1e5 + 9;
struct node
{
int xi;
int eps;
};
bool cmp(node a,node b)
{
return a.eps > b.eps;
}
node eq1[maxn];
node eq2[maxn];
node jia[maxn];
node cheng[maxn];
node ch[maxn];
int main()
{
//freopen("input.txt","r",stdin);
int num1,num2;
scanf("%d",&num1);
for(int i = 0;i < num1; i++)
{
scanf("%d%d",&eq1[i].xi,&eq1[i].eps);
}
scanf("%d",&num2);
for(int i = 0;i < num2;i++)
{
scanf("%d%d",&eq2[i].xi,&eq2[i].eps);
jia[i].xi = eq2[i].xi;
jia[i].eps = eq2[i].eps;
}
//---------------------------------------------
int ct = 0;
for(int i=0;i<num1;i++)
{
for(int j=0;j<num2;j++)
{
cheng[ct].xi = eq1[i].xi * eq2[j].xi;
cheng[ct].eps = eq1[i].eps + eq2[j].eps;
ct++;
}
}
sort(cheng,cheng+ct,cmp);
//printf("---%d\n",ct);
int temp = 0;
ch[0].xi = cheng[0].xi;
ch[0].eps = cheng[0].eps;
for(int i=1;i<ct;i++)
{
while(cheng[i].eps == ch[temp].eps)
{
ch[temp].xi += cheng[i].xi;
i++;
}
temp++;
ch[temp].xi = cheng[i].xi;
ch[temp].eps = cheng[i].eps;
}
int cnt_0 = 0;
for(int i = 0 ;i <= temp;i++)
{
if(ch[i].xi == 0) cnt_0++;
}
if(cnt_0 == temp + 1)
{
printf("0 0\n");
}
else
{
for(int i = 0;i <= temp;i++)
{
if(i != temp)
{
if(ch[i].xi!=0)
{
if(i!=0) printf(" ");
printf("%d %d",ch[i].xi,ch[i].eps);
}
}
else
{
if(ch[i].xi!=0)
{
if(i!=0) printf(" ");
printf("%d %d",ch[i].xi,ch[i].eps);
}
}
}
printf("\n");
}
//------------------------------------------------------
int cnt_jia = num2;
int cnt = num2;
for(int j = 0;j < num1;j++)
{
int flag = 0;
for(int i = 0;i < cnt_jia;i++)
{
if(jia[i].eps == eq1[j].eps)
{
jia[i].xi = jia[i].xi + eq1[j].xi;
flag = 1;
}
}
if(flag == 0)
{
jia[cnt].xi = eq1[j].xi;
jia[cnt].eps = eq1[j].eps;
cnt++;
}
}
sort(jia,jia + cnt,cmp);
/*printf("----------\n");
for(int i=0;i
// remember to take all 0 into consideration
int count = 0;
for(int i=0;i<cnt;i++)
{
if(jia[i].xi == 0)
count++;
}
if(count == cnt)
{
printf("0 0\n");
return 0;
}
for(int i = 0;i < cnt ;i++)
{
if(i != cnt-1)
{
if(jia[i].xi !=0 )
{
if(i!=0) printf(" ");
printf("%d %d",jia[i].xi,jia[i].eps);
}
}
else
{
if(jia[i].xi !=0 )
{
if(i!=0) printf(" ");
printf("%d %d",jia[i].xi,jia[i].eps);
}
}
}
return 0;
}
/*一些总结:
有一说一,自己是真的没想到这么简单地一道题能写这么久,有这么多bug */
7:六度分离
一道图论题
有一说一,如果按题目所给的数据范围,n <= 1e3 是完全不能跑Floyd的,且因为他的边并没有很多,所以标程应该是每个点跑一遍堆优化的dij。
但是呢问题来了qwq,我比较懒,所以就写了一个Floyd扔上去准备看着大大的tle令我死心,结果,AC???
n3过一千,怕是光速测评机哈哈。
#include
#include
#include
using namespace std;
const int maxn = 1e3 + 9;
int maze[maxn][maxn] = { 0 };
int n,m;
int main()
{
scanf("%d%d",&n,&m);
memset(maze,0x3f3f3f,sizeof(maze));
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
maze[a][b] = 1;
maze[b][a] = 1;
}
for(int k =1;k <= n;k++)
{
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
maze[i][j] = min(maze[i][j],maze[i][k] + maze[k][j]);
}
}
}
int cnt[maxn];
memset(cnt,0,sizeof cnt);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(maze[i][j] <= 6)
{
cnt[i]++;
cnt[j]++;
}
}
}
for(int i=1;i<=n;i++)
{
printf("%d: %.2f%\n",i,100.0*cnt[i]/(2.0*n));
}
return 0;
}