BUAA-SCSE Training day2 指导……

题目的确选择的比昨天难多了....

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=25719#overview


A

  int i , x , y;
  cin >> T;
  while (T --)
  {
    cin >> n;
    x = - 1 << 30 , ans = - 1 << 30;
    for (i = 1 ; i <= n ;i ++)    
    {
      cin >> y;
      ans = max(x - y, ans);
      x = max(y,x);  
    }
    cout << ans << endl;
  }  
其中1<<30代表2^30,总之是一个很大的数字...


B

  while (cin >> n && n)
  {
    memset(s, 0, sizeof(s));
    f = 0;
    while (n --)
      scanf("%d",&x) , s[x] ++;
    for (i = 1 ; i <= 100 ; i ++)
      while (s[i])
      {
        if (f) printf(" ");    
        printf("%d",i), s[i] --, f = 1;      
      }
    printf("\n");    
  }  
桶排啊桶排啊桶排啊能不写一个sort吗


C

  while (~scanf("%d",&n))
  {
    ave = 0;    
    for (i = 1 ; i <= n ;i ++)
      scanf("%d",&a[i]) , ave += a[i];
    ave /= n;
    for (i = 1 ; i <= n ;i ++)
      a[i] = a[i] - ave + a[i - 1];
    sort(a + 1, a + n + 1);
    x = a[(n + 1) >> 1];
    ans = 0;
    for (i = 1 ; i <= n ;i ++)
      ans += abs(x - a[i]);
    cout << ans << endl;    
  }  
怎么做课上也都说清楚了


D

#define N 10005
struct str
{
  int x , d , id;
  bool operator < (const str& a) const
  {
    return x < a.x;   
  }
}ant[N] , run[N];

int n , T, ans , f[N] , t , L , ca;

int main()
{
  int i , x , y;  char c;
  cin >> T;
  while (T --)
  {
    cin >> L >> t >> n;
    printf("Case #%d:\n", ++ ca);
    for (i = 1 ; i <= n ;i ++)
    {
      scanf("%d %c\n",&x,&c);
      y = c == 'L' ? -1 : 1;  
      ant[i] = (str) {x , y , i};
      run[i] = (str) {x + t * y , y , i};
    }
    sort(ant + 1, ant + n + 1);
    sort(run + 1, run + n + 1);
    for (i = 1 ; i <= n ;i ++)
      f[ant[i].id] = i;
    for (i = 1 ; i < n ;i ++)
      if (run[i].x == run[i + 1].x)
        run[i].d = run[i + 1].d = 0;  
    for (i = 1 ; i <= n ;i ++)     
    {
      x = f[i];
      if (run[x].x < 0 || run[x].x > L)
        printf("Fell off\n");
      else
      {
        printf("%d ",run[x].x);  
        if (run[x].d == -1)
          printf("L\n");
        if (run[x].d == 0)
          printf("Turning\n");
        if (run[x].d == 1)
          printf("R\n");    
      }  
    } 
    printf("\n");   
  }  
  return 0;
}
这个也说得够明白了,代码可供参考。。


E

int n , m , a[N];
double pi = acos(-1.);
void work()
{
  int i , x;
  double top  , bot , mid;
  scanf("%d%d",&n,&m);
  for (i = 0 ; i < n ; ++ i)
    scanf("%d",&a[i]);
  top = 0 , bot = 1e10 ;
  while (bot - top > 1e-5)
  {
    mid = (top + bot) * 0.5;
    x = 0;
    for (i = 0 ; i < n ; ++ i)
      x += (int) ((pi * a[i] * a[i]) / mid);
    if (x >= 1 + m)
      top = mid;
    else bot = mid;
  }
  printf("%.4lf\n" , top);
}
二分答案面积,然后计算是否能划分成k+1份以上,逐渐缩减范围至满足精度。


F

void work()
{
  int i , j ,  ans;
  for (i = 1 ; i <= n ; ++ i)
    scanf("%d",&a[i]) , s[i] = s[i - 1] + a[i];
  i = 0 , ans = 1 << 30;
  for (j = 1 ; j <= n ; ++ j)
  {
    while (s[j] - s[i] >= S)
      ++ i;
    if (i && s[j] - s[i - 1] >= S)
      ans = min(ans , j - i + 1);
  }
  if (ans == 1 << 30)
    ans = 0;
  cout << ans << endl;
}
双指针,细心仔细地体会一下代码吧


G

int n , m , f[N] , a[M][M], r[M] , c[M] , ans = 1 << 30;
vector<int> p;

void work()
{
  int i , j , x;
  for (i = 2 ; i * i <= 100020 ; ++ i) if (!f[i])
    for (j = i * i ; j <= 100020 ; j += i)
      f[j] = 1;
  for (i = 2 ; i <= 100020 ; ++ i) if (!f[i])
    p.push_back(i);
  cin >> n >> m;
  for (i = 1 ; i <= n ;i ++)
    for (j = 1 ; j <= m ;j ++)
    {
      cin >> a[i][j];
      x = p[lower_bound(p.begin() , p.end() , a[i][j]) - p.begin()];
      a[i][j] = x - a[i][j];
      r[i] += a[i][j] , c[j] += a[i][j];
    }
  for (i = 1 ; i <= n ;i ++)
    ans = min(ans , r[i]);
  for (j = 1 ; j <= m ;j ++)
    ans = min(ans , c[j]);
  cout << ans << endl;
}
带着大家写过这个题,这里运用了STL的库函数lower_bound和vector,实现的是一样的功能。

建议自己再写一遍素数筛法


H

int n , k, a[N];
vector<int> ans[N];
bool f[N];
int main()
{
  int i , j , x;
  cin >> n >> k;
  for (i = 1 ;i <= k ;i ++)
  {
    cin >> x;
    f[x] = 1 , ans[i].push_back(x);  
  }
  for (j = 1 ;j <= k ;j ++)
    for (i = 1 ;i <= n * k && ans[j].size() < n;i ++)
      if (!f[i])
        f[i] = 1 ,ans[j].push_back(i);
  for (i = 1 ;i <= k ;i ++)
  {
    for (j = 0 ;j < n ;j ++)
      printf("%d ",ans[i][j]);
    printf("\n")    ;
  }       
  return 0;    
}
只要能读懂题目就能发现这是一个大水题……


I

int n ;
long long a[N] , t , m = 1 << 30;

void work()
{
  int i , x = 1, ans = 0;
  cin >> n >> t;
  for (i = 1 ; i <= n ;i ++)
    scanf("%I64d",&a[i]), m = min(m , a[i]) , a[i] += a[i - 1] ;
  if (t < m) {cout << 0; return;}
  for (i = 1 ; i <= n ;i ++)
  {
    while (x != n && a[x] <= t + a[i - 1])
      ++ x;
    if (a[x] <= t + a[i - 1])
      ans = max(ans , x - i + 1);
    else  ans = max(ans , x - i);
  }
  cout << ans << endl;
}
也是双指针和F一模一样的方法与思路,强烈建议自己写写。

也可以用二分查找来做,也强烈建议写写二分查找。


J

int n;
int work(int a,int b)
{
  if ((a == 1 || a == 2 || a == 6 || a == 5) && (b == 1 || b == 2 || b == 6 || b == 5))
    return 3;
  if ((a == 1 || a == 3 || a == 6 || a == 4) && (b == 1 || b == 3 || b == 6 || b == 4))
    return 2;
  if ((a == 3 || a == 2 || a == 5 || a == 4) && (b == 3 || b == 2 || b == 5 || b == 4))
    return 1;    
}
int main()
{
  int i,x,y,a,b;  
  scanf("%d %d",&n,&x);
  for (i = 1 ;i <= n ;i ++)
  {
    scanf("%d %d",&a,&b);
    y = work(a , b);
    if (y != x && y != 7 - x)
      break;
  }  
  if (i <= n)
    printf("NO");
  else printf("YES");
  return 0;  
}

简单的构造题


K

int n , a[N];
bool f[N];
void work()
{
  int i ;
  long long ans = 0;
  scanf("%d",&n);
  for (i = 1 ; i <= n ; ++ i)
    scanf("%d",&a[i]);
  sort(a + 1 , a + 1 + n);
  for (i = 1 ; i <= n ;i ++)
    ans += abs(a[i] - i);
  cout << ans << endl;
}

课上已讲,注意要用long long


L

排序和贪心,这道题各位自己写吧……

主要是要读懂题目,别被长题吓着


这场|Training的时间已经延长到周日早晨,祝大家在这两天把所有题目都搞定,体会收获Accepted的乐趣。











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值