zoukankan      html  css  js  c++  java
  • H

    H - Graphics

     
    Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

    Description

    Ocean最近迷上了图形学,整天就在电脑上写程序画呀画......

    这天Ocean想画一个二维平面下的圆,

    但他的电脑出了一点莫名其妙的问题。                                                         

    假设Ocean只能用程序实现$45$度圆弧、$90$度圆弧、$180$度圆弧,而且程序耗时分别是$a、b、c$。 

    如果Ocean连续画圆心角相同的圆弧,那么程序执行时间将会是上一次的$2$倍。 
    比如说: 
    第一次Ocean画圆心角为$45$度的圆弧耗时为$a$。 
    第二次Ocean还是画圆心角为$45$度的圆弧,耗时为$2 * a$。 
    第三次Ocean还是画圆心角为$45$度的圆弧,耗时为$4 * a$。 
    ...... 

    如果Ocean下次画圆心角不同的圆弧,那么程序执行将会额外增加一定的时间$d$。 
    比如说: 
    Ocean上一次画$45$度的圆弧,这一次画$90$度圆弧,程序执行时将会额外增加时间$d$。 
    Ocean上一次画$90$度的圆弧,这一次画$180$度圆弧,程序执行时将会额外增加时间$d$。 

    ......

    马上就要图形学课设了,Ocean需要用最短的程序执行时间来完成这个圆,请你帮帮他吧。

    PS:任意两个圆弧不能重复覆盖,而且所有圆弧的弧长是相等的。

    C++输入输出务必使用scanf 和 printf。

    Input

    第一行输入一个整数$T$,代表有$T$组测试数据。 
    每组数据依次输入四个整数$a,b,c,d,$分别代表上面提到的信息。 

    注:$1 <= T <= 200000, 1 <= a, b, c, d <= 1000000。$ 

    Output

    对每组测试数据,输出一个整数代表程序执行所需的最短时间。

    Sample Input

    2
    1 1 1 2
    1 2 4 1

    Sample Output

    3
    10

    Hint

    对第二组测试数据,最优方案如下:

    先画一个$90$度圆弧,第二次画$180$度圆弧,最后一次画$90$度圆弧。

    总耗时$2 + 1 + 4 + 1 + 2 = 10。$

    这道题我使用暴力解的,原来还可以用深搜的方法来解

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 using namespace std;
     5 const int INF=0x3f3f3f3f;
     6 int a,b,c,d,ans;
     7 int angle[3]={45,90,180};
     8 int cost[3];
     9 void dfs(int x,int y,int id,int cnt)
    10 {
    11     int sum,time;
    12     for(int i=0;i<3;i++)
    13     {
    14         sum=x+angle[i];
    15         if(sum==360)
    16         {
    17             if(i==id)
    18                 time=y+cost[i]*cnt*2;
    19             else
    20                 time=y+cost[i]+d;
    21             ans=min(ans,time);
    22         }
    23         else if(sum<360)
    24         {
    25             if(i==id)
    26                 dfs(sum,y+cost[i]*cnt*2,i,cnt*2);
    27             else
    28                 dfs(sum,y+cost[i]+d,i,1);
    29         }
    30     }
    31 }
    32 int main()
    33 {
    34     int t;
    35     scanf("%d",&t);
    36     while(t--)
    37     {
    38         scanf("%d%d%d%d",&a,&b,&c,&d);
    39         cost[0]=a; cost[1]=b; cost[2]=c;
    40         ans=INF;
    41         for(int i=0;i<3;i++)
    42             dfs(angle[i],cost[i],i,1);
    43         printf("%d
    ",ans);
    44     }
    45     return 0;
    46 }
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    循环取出正则匹配的内容(遍历).
    遍历datatable的方法
    asp.net获取URL和IP地址
    匹配多个字符串方法
    世界杯决赛不好看,有点像假球,被裁判黑了?
    2010南非世界杯冠军预测:荷兰夺冠!
    查了几家人民广场附近的川菜和湘菜馆
    白平衡(转载自wikipedia)
    梦想与感动
    港澳旅游相关备忘
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7410527.html
Copyright © 2011-2022 走看看