題意 : 就是求個gpa
思路 : 不說了 ...
#include #include #include using namespace std;
double cal( char * str ) else if( strcmp( str , "b" ) == 0 )
return 3.0 ;
else if( strcmp( str , "b-" ) == 0 )
return 2.7 ;
else if( strcmp( str , "c+" ) == 0 )
return 2.3 ;
else if( strcmp( str , "c" ) == 0 )
return 2.0 ;
else if( strcmp( str , "c-") == 0 )
return 1.7 ;
else if( strcmp( str , "d" ) == 0 )
return 1.3 ;
else if( strcmp( str , "d-") == 0 )
return 1.0 ;
else
return 0.0 ;
}int main()
if( sum == 0 ) else
} return 0 ;
}
題意 : 題意好長 ... 不想說了 ~~
思路 : 首先物品增加的個數是一定的, 那麼當然是單價比較高的時候增加個數才優。並且因為單價只會增加不會減少,所以我們貪心的同時還好保證單價不能大於等於 ( y + 1 ) / x 。 當然乙個乙個模擬是行不通的 , 我們直接用公式計算當前個數不變的情況,單價能增加到**就好。因為x很小,所以時間就完全沒有壓力了。另外y>x的時候不可能達到。
#include #include #include using namespace std;
int main()
int cnt = 0;
while( true )
double h = price2 * a - 1e-8 ;
int cha = h - b ;
cnt += cha ;
b += cha ;
price_now = b / a ;
a ++ ;
cnt ++ ;
b += price_now ;
} cnt += y - (int)b;
printf( "%d\n" , cnt ) ;
} return 0 ;
}
題意: 給你乙個n*m的棋盤,m<=10 , 用1*1,1*2 的骨牌去覆蓋 , 有些格仔不能放骨牌,並且要求1*1放置的骨牌數要在 c 和 d 之間 。
思路 : 這題是用輪廓線dp去做 , 但是之前不會 , 所以看了一下大白書上面的專題 ,看懂之後感覺這題就是入門題啊
輪廓線dp遞推的順序是從左到右從上到下 , 假設當前是( i , j ) 那麼輪廓線dp儲存的狀態一般為 (i-1,j)(i-1,j+1) ... ( i , j -1 ) 這些格仔的狀態 , 然後根據這些格仔的狀態遞推就可以了。
這道題的狀態是 dp[當前決策的格仔][輪廓線的狀態][1*1格仔的個數] , 然後遞推就行了
#include #include #include using namespace std;
#define mod 1000000007
int n , m , c , d ;
char mp[105][15] ;
__int64 dp[2][(1<<11)][22] ;
int cur , pre ;
int size ;
void update( int prek , int curk , int prec , int curc )
}int main() }}
int main()
}} for( int i = 1 ; i <= n ; i ++ )
}} for( int i = 1 ;i <= n; i ++ )
puts( "" ) ;
} return 0 ;
}
題意 : 有三種顏色的球 , 給你然後你按順序放球 , 每次放進去乙個球,會得到乙個分數。分數為放進去求的位置的左邊不同顏色的球的個數和右邊不同顏色的球的個數。
思路 : 沒什麼好說的 .. 直接分類討論就好了
#include #include #include using namespace std;
__int64 a[4] ;
bool cmp( __int64 a , __int64 b )
int main()
if( a[1] == 0 ) else if( a[0] == 2 ) else
continue ;
} if( a[2] == 0 )
}else
continue ;
} if( a[2] >= 2 ) else if( a[1] >= 2 ) else if( a[0] >= 2 ) else
} return 0 ;
}
題意 : 給你一棵樹 , 每個點有權值 , 問是否有一條路徑的乘積是k 。
思路 : 基於點的分治 , 對於乙個重心 ,我們列舉以重心為根路徑,計算出每個點從路徑到根的乘積 , 然後對於這個乘積 val, 我們通過hash查詢 k * inv[val] 是否存在 。hash[val] 我存的到當前重心路徑乘積為val中下標最小的點,如果是inf則表示不存在,為了防止兩個端點都在同一子樹,要先訪問完一遍子樹,然後再更新hash。
#include #include #include using namespace std;
#pragma comment(linker,"/stack:102400000,102400000")
typedef __int64 ll ;
#define inf 0x3f3f3f3f
#define maxn 100005
#define mod 1000003
int ans[2] ;
int n , m , k ;
bool vis[maxn] ;
int val[maxn] ;
int inv[mod] ;
int pi[mod] ;
struct tree
edge( int _to , int _nex )
}edge[maxn*2] ;
int head[maxn] , index ;
void init()
void add( int from , int to )
}tree;
int sum[maxn] , max[maxn] ;
void dfs1( int u , int p )
}int min , mini ;
void dfs2( int u , int p , int ss )
for( int i = tree.head[u] ; ~i ; i = tree.edge[i].nex )
}int getroot( int u )
void dfs3( int u , int p , int val )
}for( int i = tree.head[u] ; ~i ; i = tree.edge[i].nex )
}void dfs4( int u , int p , int val )
}void dfs5( int u , int p , int val )
}void solve( int u )
for( int i = tree.head[root] ; ~i ; i = tree.edge[i].nex )
pi[val[root]] = inf ;
vis[root] = true ;
for( int i = tree.head[root] ; ~i ; i = tree.edge[i].nex )
}ll power( int a , int k )
int main()
memset( pi , inf , sizeof(pi) ) ;
while( scanf( "%d%d" , &n , &k ) != eof )
for( int i = 1 ; i < n ; i ++ )
ans[0] = inf ;
ans[1] = inf ;
memset( vis , false , sizeof(vis) ) ;
solve( 1 ) ;
if( ans[0] == inf ) else
}return 0 ;
}
2018南京ICPC現場賽部分題題解
給你n個石子,下標從1到n,每次最多取連續的k個石子,問最後誰能贏 取完石子的那個人算贏 如果有奇數個石子,那麼a中間取乙個,b拿什麼,a接下去就在對稱的另一邊拿什麼,這樣a贏。如果有偶數個石子,且b 1 那麼a可以在中間取兩個,然後又回到了上述的過程,這樣a贏。如果b 1,那麼石子是偶數個,則b贏...
周賽題解報告 2013 亞洲南京區域賽
全是2013 亞洲南京區域賽的題 感觸挺深的。補了五道題,之後要是補了會加上來。a gpa 水題沒什麼好說的 b poor warehouse ke eper 貪心 這道題被精度wa了。1e 5 要以最短的步數到達給定的x,y 可以看出x的增加次數是固定的 步數要最短,那麼我們貪心的原則就是在x越小...
2013ACM ICPC亞洲區南京站現場賽G題
題目大意 乙個n維的系統中隨機選乙個向量 x1,x2,x3,xn 其中0 xi r,且x1 2 x2 2 x3 2 xn 2 r 2。現在給定n,r。求xi的期望。其實是一道很簡單的數學題。首先證明 對於 x1,x2,x3,xn 其中0 xi r,且x1 2 x2 2 x3 2 xn 2 r 2 x...