1017C The Phone Number:
构造数列使得LIS和LDS的和最小,定理已知LIS=L,LDS=n/L的向上取整,根据样例可以得到设置L=根号n,构造方法如样例
截断法构造,不用考虑边界:
Show an example of n=22:
"' 19 20 21 22 15 16 17 18 11 12 13 14 7 8 9 10 3 4 5 6 1 2 "'
1 int tmp = sqrt(n); 2 for(int i=1,j,o=n;i<=n;i+=tmp) 3 { 4 for(j=min(i+tmp-1,n);j>=i;a[j--]=o--); 5 }
1019A Elections:
选举投票,收买投票人使得1号获胜的最少金额,本题容易陷入样例的坑里而无法自拔。正确做法观察输入规模3000,时间1s,那就枚举咯
1 int n,m,a[3010],b[3010],x[3010],c[3010]; 2 L p=1e18; 3 int main() 4 { 5 int i,j; 6 L k; 7 scanf("%d%d",&n,&m); 8 for(i=1;i<=n;i++) 9 scanf("%d%d",&a[i],&b[i]); 10 for(i=1;i<=n;i++) // 两个数组的选择排序 11 for(j=i+1;j<=n;j++) 12 if(b[i]>b[j]) 13 swap(a[i],a[j]),swap(b[i],b[j]); 14 for(i=0;i<=n;i++) // 枚举所有的次小值i 15 { 16 k=0; 17 for(j=1;j<=m;j++) 18 x[j]=0; 19 for(j=1;j<=n;j++) 20 c[j]=0; 21 for(j=n;j>0;j--) // 从后向前 22 if(x[a[j]]<i || a[j]==1) 23 x[a[j]]++; 24 else 25 k+=b[j],c[j]=1,x[1]++; // 超过阈值的,都买入 26 for(j=1;j<=n;j++) // 能买的再过一遍 27 if(x[1]<=i && a[j]!=1 && c[j]==0) 28 k+=b[j],c[j]=1,x[1]++; 29 if(x[1]>i) 30 p=min(p,k); 31 } 32 cout<<p; 33 return 0; 34 }