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)
原文地址:https://www.cnblogs.com/h-hkai/p/7410527.html