H - Graphics(dfs)
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。$
每组数据依次输入四个整数$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\n",ans); 44 } 45 return 0; 46 }
永远渴望,大智若愚(stay hungry, stay foolish)