codeforces div2 C题思路训练【C题好难,我好菜】

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 }
原文地址:https://www.cnblogs.com/demian/p/9459820.html