信息学奥赛一本通【01NOIP提高组】题解

目录

1824:【01NOIP提高组】一元三次方程求解

【题目描述】

【输入】

【输出】

【输入样例】

【输出样例】

1825:【01NOIP提高组】数的划分

【题目描述】

【输入】

【输出】

【输入样例】

【输出样例】

【提示】

1826:【01NOIP提高组】统计单词个数

【题目描述】

【输入】

【输出】

【输入样例】

【输出样例】

1827:【01NOIP提高组】Car的旅行路线

【题目描述】

【输入】

【输出】

【输入样例】

【输出样例】


1824:【01NOIP提高组】一元三次方程求解


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 1206     通过数: 816

【题目描述】

有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。

提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根。

【输入】

一行,即输入a,b,c,d

【输出】

一行,三个实根

【输入样例】

1 -5 -4 20

【输出样例】

-2.00 2.00 5.00

题解:

#include
#include
using namespace std;
int main()
{
    double a,b,c,d;
    scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    for(double x=-100;x<=100;x+=0.01)
    {
        if(abs(a*x*x*x+b*x*x+c*x+d)<=0.00001)printf("%.2f ",x);
    }
    return 0;
}

1825:【01NOIP提高组】数的划分


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 1114     通过数: 818

【题目描述】

将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。

例如:n=7,k=3,下面三种分法被认为是相同的。

1,1,5; 1,5,1; 5,1,1;

问有多少种不同的分法。

【输入】

输入n和k (6<n<=200,2<=k<=6)

【输出】

一个整数,即不同的分法数。

【输入样例】

7 3

【输出样例】

4

【提示】

样例说明:

四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;

题解:

#include
using namespace std;
int n,k,a[15],tot;
void dfs(int num,int pos)
{
    if(pos==k) 
     if(num>=a[pos-1]) 
     {
         tot++;
         return;
     }
     for(int i=a[pos-1];i<=num&&num/(k-pos)>=i;i++)
     {
         a[pos]=i;
         dfs(num-i,pos+1);
         a[pos]=0;
     }
}
int main()
{
    a[0]=1;
    cin>>n>>k;
    dfs(n,1);
    cout<

1826:【01NOIP提高组】统计单词个数


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 403     通过数: 202

【题目描述】

给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1

单词在给出的一个不超过6个单词的字典中。

要求输出最大的个数。

【输入】

第一行有二个正整数(p,k),p表示字串的行数,k表示分为k个部分。

接下来的p行,每行均有20个字符。

再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)

接下来的s行,每行均有一个单词。

【输出】

一个整数,最大单词个数。

【输入样例】

1 3
thisisabookyouareaoh
4
is
a
ok
sab

【输出样例】

7

题解:

#include
#include
#include
#include
#include
using namespace std;
int n,p,m;
char s[300],word[20][210];
int sa[300][300];//从i到j之间有几个单词 
bool tf[300];
int f[300][300];//从1到i,切成j段的最多单词数 
int main()
{
    scanf("%d%d",&n,&p);
    for(int i=0;i

1827:【01NOIP提高组】Car的旅行路线


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 358     通过数: 185

【题目描述】

又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第i个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。

图例

信息学奥赛一本通【01NOIP提高组】题解_第1张图片

机场

高速铁路

机航线

注意:图中并没有

标出所有的铁路与航线。

那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。

任务

找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

【输入】

第一行为一个正整数n(0≤n≤10),表示有n组测试数据。

每组的第一行有四个正整数s,t,A,B。

S(0

接下来有S行,其中第i行均有7个正整数xi1,yi1,xi2,yi2,xi3,yi3,Ti,这当中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分别是第I个城市中任意三个机场的坐标,Ti为第i个城市高速铁路单位里程的价格。

【输出】

共有n行,每行一个数据对应测试数据。

【输入样例】

1
3 10 1 3
1 1 1 3 3 1 30
2 5 7 4 5 2 1
8 6 8 8 11 6 3

【输出样例】

47.55

题解:

#include
using namespace std;
const int maxn=105;
int n,s,t,A,B,T[maxn<<2];
double dis[maxn<<2];
bool book[maxn<<2];
struct data{
    int city;
    int x,y;
}a[maxn<<2];
inline int power_2(int x)
{
    return x*x;
}
void getlast(int x1,int y1,int x2,int y2,int x3,int y3,int i)
{
    int x4,y4;
    int dis1=power_2(x1-x2)+power_2(y1-y2),
        dis2=power_2(x1-x3)+power_2(y1-y3),
        dis3=power_2(x2-x3)+power_2(y2-y3);
    if(dis2==dis1+dis3) x4=x3-x2+x1,y4=y3+y1-y2;
    if(dis1==dis2+dis3) x4=x2-x3+x1,y4=y2+y1-y3;
    if(dis3==dis1+dis2) x4=x3-x1+x2,y4=y3+y2-y1;
    a[i+3].x=x4;a[i+3].y=y4;
}
inline double distance(int x1,int y1,int x2,int y2)
{
    return sqrt(power_2(x1-x2)+power_2(y1-y2));
}
void SPFA()
{
    memset(book,0,sizeof(book));
    queue  q;
    for(int i=1;i<=s<<2;i++) dis[i]=99999999;
    for(int i=A*4-3;i<=A*4;i++) dis[i]=0,q.push(i),book[i]=1;
    while(!q.empty())
    {
        int u=q.front();q.pop();book[u]=0;
        for(int i=1;i<=s<<2;i++)
        {
            if(i==u) continue;
            double cost=distance(a[i].x,a[i].y,a[u].x,a[u].y);
            if(a[i].city==a[u].city) cost*=T[a[i].city];
            else cost*=t;
            if(dis[i]>dis[u]+cost)
            {
                dis[i]=dis[u]+cost;
                if(!book[i]) 
                {
                    book[i]=1;
                    q.push(i);
                }
            }
         }
    }
}
void init()
{
    //memset(t,0,sizeof(t));
    memset(a,0,sizeof(a));
    scanf("%d%d%d%d",&s,&t,&A,&B);
    int i;
    for(i=1;i<=s<<2;i+=4)
    {
        //int x1,x2,x3,y1,y2,y3;
        scanf("%d%d%d%d%d%d%d",&a[i].x,&a[i].y,&a[i+1].x,&a[i+1].y,&a[i+2].x,&a[i+2].y,&T[i/4+1]);
        a[i].city=a[i+1].city=a[i+2].city=a[i+3].city=i/4+1;
        getlast(a[i].x,a[i].y,a[i+1].x,a[i+1].y,a[i+2].x,a[i+2].y,i);
    }
}
int main()
{
    scanf("%d",&n);
    int i;
    for(i=1;i<=n;i++)
    {
        init();
        SPFA();
        double ans=dis[B<<2];
        for(int j=B*4-3;jdis[j]) ans=dis[j];
        printf("%.2lf\n",ans);
    }    
    return 0;
}

你可能感兴趣的:(NOIP&CSPS,蓝桥杯,c++,算法)