CF div2 C

第一次打cf不懂规则,就按hdu的经验去做题,结果题题TLE,后来我试着把while去掉,终于过了B题,A题是水题,然而一直死在test 42,后来就没去管了。C题没看太懂题,后来去网上找到了翻译,发现也好简单,一次ac。哎,怪我英语不行。E题我用双端队列解会超时,因为我每次删除元素后都要找一次最大值。别人给我建议是用优先队列,或者是再用一个最小值队列。找个时间去学优先队列吧。

附上C题代码:

#include
#include
#include
using namespace std;
int const maxn = 2000 + 10;
set ans;
int k, n, score[maxn], b[maxn];
int  find(int t)
{
 int flag;
 for (int j = 2; j <= n; j++) //每一个ans必须满足 t+score i=b[j]  i从1到k,j从2到n,因为答案就是从b1算出来的,所以从2开始即可
 {
  flag=0;
  for (int i = 1; i <= k; i++)
  {
   if (t + score[i] == b[j])
   {
    flag=1;break;
   }
  }
  if(flag) continue;
  else return 0;
 }
 return 1;
}
int main()
{
  cin >> k >> n;
                int op = 0;
                score[0] = 0;
                for (int i = 1; i <= k; i++)
                {
                        cin >> score[i];
                        score[i] += score[i - 1];
                }
                for (int i = 1; i <= n; i++)
                        cin >> b[i];
                for (int i = 1; i <= k; i++)
                {
                        int t = b[1] - score[i]; //答案肯定就在ans中,用find()去一一验证
                        if(ans.count(t)) continue;
                        else ans.insert(t);
   if(find(t)) op++;
                }
  cout<   return 0;
}

你可能感兴趣的:(cf)