2009-7-27
/*
Tju 3207. Sand Castle
http://acm.tju.edu.cn/toj/showp3207.html
排序后贪心,贪心的正确性证明很简单,只要匹配出现交叉则浪费
*/
#include < stdio.h >
#include < algorithm >
using namespace std;
int na[ 25001 ];
int nb[ 25001 ];
int cmp( int x , int y){
return x < y;
}
int main(){
int n , h1, h2 ;
scanf( " %d%d%d " , & n, & h1, & h2);
for ( int i = 0 ; i < n ; i ++ )
scanf( " %d%d " , & na[i], & nb[i]);
sort(na,na + n,cmp);
sort(nb,nb + n,cmp);
int sum = 0 ;
for ( int i = 0 ; i < n ; i ++ ){
if (na[i] > nb[i]){
sum += h2 * (na[i] - nb[i]);
}
else {
sum += h1 * (nb[i] - na[i]);
}
}
printf( " %d\n " ,sum);
return 0 ;
}
http://acm.tju.edu.cn/toj/showp3207.html
排序后贪心,贪心的正确性证明很简单,只要匹配出现交叉则浪费
*/
#include < stdio.h >
#include < algorithm >
using namespace std;
int na[ 25001 ];
int nb[ 25001 ];
int cmp( int x , int y){
return x < y;
}
int main(){
int n , h1, h2 ;
scanf( " %d%d%d " , & n, & h1, & h2);
for ( int i = 0 ; i < n ; i ++ )
scanf( " %d%d " , & na[i], & nb[i]);
sort(na,na + n,cmp);
sort(nb,nb + n,cmp);
int sum = 0 ;
for ( int i = 0 ; i < n ; i ++ ){
if (na[i] > nb[i]){
sum += h2 * (na[i] - nb[i]);
}
else {
sum += h1 * (nb[i] - na[i]);
}
}
printf( " %d\n " ,sum);
return 0 ;
}
/*
TJU 3209. Look Up
http://acm.tju.edu.cn/toj/showp3209.html
自底而上扫,纪录结果,以纪录跳转的方式优化时间
*/
#include < stdio.h >
int a[ 100001 ];
int ans[ 100001 ];
int now;
int main(){
int n;
scanf( " %d " , & n);
for ( int i = 0 ; i < n ; i ++ ){
scanf( " %d " , & a[i]);
}
ans[n - 1 ] = - 1 ;
for ( int i = n - 2 ; i >= 0 ; i -- ){
if (a[i] < a[i + 1 ]){
ans[i] = i + 1 ;
}
else {
now = i + 1 ;
while ( 1 ){
if (now == - 1 ){
if (a[now] > a[i])
ans[i] = now;
else
ans[i] = - 1 ;
break ;
}
if (a[now] > a[i] )
{
ans[i] = now;
break ;
}
else {
now = ans[now];
}
}
}
}
for ( int i = 0 ; i < n ; i ++ )
printf( " %d\n " ,ans[i] + 1 );
return 0 ;
}
TJU 3209. Look Up
http://acm.tju.edu.cn/toj/showp3209.html
自底而上扫,纪录结果,以纪录跳转的方式优化时间
*/
#include < stdio.h >
int a[ 100001 ];
int ans[ 100001 ];
int now;
int main(){
int n;
scanf( " %d " , & n);
for ( int i = 0 ; i < n ; i ++ ){
scanf( " %d " , & a[i]);
}
ans[n - 1 ] = - 1 ;
for ( int i = n - 2 ; i >= 0 ; i -- ){
if (a[i] < a[i + 1 ]){
ans[i] = i + 1 ;
}
else {
now = i + 1 ;
while ( 1 ){
if (now == - 1 ){
if (a[now] > a[i])
ans[i] = now;
else
ans[i] = - 1 ;
break ;
}
if (a[now] > a[i] )
{
ans[i] = now;
break ;
}
else {
now = ans[now];
}
}
}
}
for ( int i = 0 ; i < n ; i ++ )
printf( " %d\n " ,ans[i] + 1 );
return 0 ;
}



































