题目的确选择的比昨天难多了....
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的乐趣。