前言
又有一个高一巨佬坐到了我这一排,极其的慌。
早上
今天特地早点起,终于没有迟到。
打算像昨天那样看问题再做。
题目
T1:立体井字棋
在nnn的立方体中放n个子,有
求多少种布子方案可以使这n个子连成一条线。
T2:最小花费
某些人可以互相转账,给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。
T3:最大约数和
选取和不超过S的若干个不同的正整数,使所有数的约数(不含它本身)之和最大。
T4:电子表格
第一行输入两个用空格隔开的正整数m和n,分别代表表格的列数和行数。
第二行输入一个正整数s,表示操作的总数。
以下s行每行输入一个操作:
1.每个操作占一行,根据操作类型的不同,每行中可能有二至四个用空格隔开的“单词”;
2.每行的第一个单词指定了该操作涉及的单元格的位置;
3.每行的第二个单词指定了相应的操作,可能是: input,output,sum,avg
(1).如果第二个单词是input,表示接下来的一个整数是要赋予该单元格的值,这个值是
不超过1000的正整数
(2).如果第二个单词是output,表示你需要在输出文件中输出这个单元格当前的值
(3).如果第二个单词是sum,表示接下来输入的两个单词定义了一个矩形区域,该单元格的值就应该恒为这个矩形区域中所包含的单元格的值的和,直到该单元格被重新定义
(4).如果第二个单词是avg,表示接下来输入的两个单词定义了一个矩形区域,该单元格的值就应该恒为这个矩形区域中所包含的单元格的值的算术平均数,直到该单元格被重新定义;
…对于输入数据的每一个“ output”操作输出一行结果。因此,输出文件的行数等于输入文
件中“ output”操作的个数。
比赛过程&&想法
先把四题都看一下:
第一题,看完之后蒙了一会,然后就发现是一道找公式的题目。
第二题,发现是一道做过的最短路,决定用Dijkstra算法来做。
第三题,感觉是一道背包,但是思路非常懵。
第四题,认为是一道模拟题。
然后就开始推第一题的公式,推了二十多分钟后,推出了一个。
预计得分:50分。
接着去做第二题,又去最近刚做过,火速A掉样例,然后就不鸟他了。
(反正我也检查不出错误)
预计得分:50分。
然后去模拟第四题,过了很久后对了样例,然后又不鸟他了。
(反正我也只会模拟)
预计得分:0分。
最后的时间,我决定去刚第三题,在比赛还剩二十分钟时A掉了样例。
预计得分:50分
然后开始提交代码。
接着我发现——
O J 炸 了 ! ! ! OJ炸了!!! OJ炸了!!!
卡在待评测动不了。
然后成功“爆零”。
(不过后来系统好了,那几题也评好了,没爆零)
预计得分:50+50+50+0=150分
实际得分:0+100+50+0=150分
送上第二题AC代码:
T2
#include<cstdio>
#include<iostream>
using namespace std;
double a[2001][2001],b[2001],maxn,z;
bool c[2001];
int n,m,x,y,l;
int main()
{
//freopen("money.in","r",stdin);
//freopen("money.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d%lf",&x,&y,&z);
a[x][y]=a[y][x]=(100-z)/100;
}
scanf("%d%d",&x,&y);
for (int i=1;i<=n;i++)
b[i]=a[x][i];
b[x]=1;
c[x]=1;
for (int i=2;i<=n;i++)//Dijkstra算法
{
maxn=0;
l=0;
for (int j=1;j<=n;j++)
if (!c[j]&&b[j]>maxn)
{
maxn=b[j];
l=j;
}
c[l]=1;
for (int j=1;j<=n;j++)
if (!c[j])
b[j]=max(b[l]*a[l][j],b[j]);
}
printf("%.8lf",100/b[y]);
fclose(stdin);
fclose(stdout);
return 0;
}
下午
听讲解加改题
改A了第一题,发现自己找的公式完全不对。
送上第一题代码:
T1
#include<cstdio>
using namespace std;
int n;
int main()
{
//freopen("tictac.in","r",stdin);
//freopen("tictac.out","w",stdout);
scanf("%d",&n);
printf("%d",((n+2)*(n+2)*(n+2)-n*n*n)/2);//公式
fclose(stdin);
fclose(stdout);
return 0;
}
晚上
继续改题……
改A了第三题。
送上代码:
T3
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
int n,a[2001];
int main()
{
//freopen("maxsum.in","r",stdin);
//freopen("maxsum.out","w",stdout);
memset(a,0,sizeof(a));
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
if (i%j==0&&i!=1&&i!=j) a[i]+=j;//求出每个数的约数和
for (int i=1;i<=n;i++)
for (int j=1;j<=i/2;j++)
a[i]=max(a[i],a[j]+a[i-j]);//背包
printf("%d",a[n]);
fclose(stdin);
fclose(stdout);
return 0;
}
一天总结
感觉先看题再做题效果真的很好。
明天继续加油。
还有四天就能回家了——