C - 柱爷的下凡
Time Limit: 400/400MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
下凡的柱爷想只创造3种硬币,要求这3种硬币可以组成 [1,N] 的所有整数,并且表示一个 [1,N] 中的整数所用硬币的平均数量最少.
你能帮柱爷解决他的小小问题吗?
Input
第一行一个正整数 T ,表示测试组数.
接下来 T 行,每行一个正整数 N .
数据保证:
-
1≤T≤200
-
1≤N≤200
Output
输出一共有 T 行,每行三个整数 A B C 表示柱爷希望的三种不同硬币的面值.如果有多组解,请保证A尽可能小,如果仍有多组解,请保证B尽量小,如果仍有多组解,请保证C尽量小. A<B<C
Sample input and output
Sample Input | Sample Output |
---|---|
1 1 | 1 2 3 |
1 7 | 1 2 5 |
Hint
当 N=7 时
- 1 元,需要 1 个 1 元
- 2 元,需要 1 个 2 元
- 3 元,需要 1 个 1 元和 1 个 2 元
- 4 元,需要 2 个 2 元
- 5 元,需要 1 个 5 元
- 6 元,需要 1 个 1 元和 1 个 5 元
- 7 元,需要 1 个 2 元和 1 个 5 元
- 平均需要约 1.57
function testmain1
close all
T = 14560000;
T = 0.8*T;
%北京市总人口(Total Population)
%1456.00万人(2003年)
%已确诊病例累计 现有疑似病例 死亡累计 治愈出院累计
d=[339 402 18 33
482 610 25 43
588 666 28 46
693 782 35 55
774 863 39 64
877 954 42 73
988 1093 48 76
1114 1255 56 78
1199 1275 59 78
1347 1358 66 83
1440 1408 75 90
1553 1415 82 100
1636 1468 91 109
1741 1493 96 115
1803 1537 100 118
1897 1510 103 121
1960 1523 107 134
2049 1514 110 141
2136 1486 112 152
2177 1425 114 168
2227 1397 116 175
2265 1411 120 186
2304 1378 129 208
2347 1338 134 244
2370 1308 139 252
2388 1317 140 257
2405 1265 141 273
2420 1250 145 307
2434 1250 147 332
2437 1249 150 349
2444 1225 154 395
2444 1221 156 447
2456 1205 158 528
2465 1179 160 582
2490 1134 163 667
2499 1105 167 704
2504 1069 168 747
2512 1005 172 828
2514 941 175 866
2517 803 176 928
2520 760 177 1006
2521 747 181 1087
2522 739 181 1124
2522 734 181 1157
2522 724 181 1189
2522 718 181 1263
2522 716 181 1321
2522 713 183 1403
2523 668 183 1446
2522 550 184 1543
2522 451 184 1653
2522 351 186 1747
2523 257 186 1821
2523 155 187 1876
2522 71 187 1944
2522 4 189 1994
2522 3 189 2015
2521 3 190 2053
2521 5 190 2120
2521 4 191 2154
2521 3 191 2171
2521 3 191 2189
2521 2 191 2231
2521 2 191 2257
2521 2 191 2277];
S = T - d(:,1)-d(:,3)-d(:,4);
I = d(:,1)+d(:,2); % 感染人数
S1 = d(:,2); % 现有疑似病例
R = d(:,3)+d(:,4);
t = (1:length(I))';
subplot(1,2,1);
h=plot(t,I,'o-',t,S1,'*');
legend(h,'I','S')
xdata = [I(1:end-1) S(1:end-1)]
ydata = diff(I)./diff(t)
%ydata = ydata((1:30),:);
coef = lsqcurvefit(@ffun,[1 1],xdata,ydata)
format long
k = coef(1)
h = coef(2)
%z=kIS-hI
% lsqcurvefit xdata(:,1) -> I, xdata(:,2)->S
[T,Y]=ode23(@dfun,[0:60],[S(1) I(1) R(1)]);
%Y(:,2) 为I的数值解
subplot(1,2,2);
%plot(xdata,ydata,'ro',xdata,ffun(coef,xdata),'k*');
plot(t,I,'ro',T',Y(:,2)','k*')
function ydata=ffun(coef,xdata)
k = coef(1); h = coef(2);
ydata = k*xdata(:,1).*xdata(:,2)-h*xdata(:,1);
function dy=dfun(t,y) %y (1)-->S, y(2)-->I
dy = zeros(2,1); S=y(1); I = y(2); R=y(3);
k = 1.738382084343759e-05;
h = 0.004435622880419;
dy(1) = -k.*I.*S;
dy(2)=k.*I.*S-h.*I;
dy(3)=h.*I;