Description
鐜版湁k涓覆錛屼竴涓洰鏍囦覆錛屼綘浠庤繖k涓瓧絎︿覆涓夊彇涓浜涘瓧絎︼紝緇勬垚鐩爣涓層傜幇鏈夌殑k涓覆涓瘡涓覆鑷沖鍙塧i涓瓧絎︼紝
鑰屼笖浠庣i涓覆涓夊彇
涓涓瓧絎﹁楄垂i涓噾甯侊紝姹傜粍鎴愮洰鏍囦覆鎵娑堣楁渶灝忕殑閲戝竵鏁幫紝濡傛灉涓嶈兘緇勬垚錛岃緭鍑?1錛?br />
Input
絎竴琛屾槸鐩爣涓詫紝絎簩琛屼竴涓猭錛?<k<=100錛?鎺ヤ笅鏉琛岋紝姣忚鍖呮嫭涓涓幇鏈変覆錛屽拰ai(鎵鏈夊瓧絎︿覆闀垮害涓嶈秴榪?00錛屼笖闈炵┖)
Output
鏈灝忔秷鑰楃殑閲戝竵
Sample Input
zhonghongyihelafeng
5
zhonghongyihenshuai 10
zhonghongyihennx 10
zhonghongyihenyingjun 10
chuxinggedadiaosi 10
wobuxihuanheichuxing 10
bbaze
3
bzb 2
aeb 3
ba 10
Sample Output
-1
8
Source
zhy
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 1010
#define MAXM 1000200
#define INF (1<<29)
int sumFlow;
struct Edge{
int u,v,cap,cost;
int next;
}edge[MAXM<<2];
int NE;
int head[MAXN],dist[MAXN],pp[MAXN];
bool vis[MAXN];
char ch[MAXN] ;
int k , n;
void init(){
NE = 0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int cap,int cost){
edge[NE].u=u;edge[NE].v=v;edge[NE].cap=cap;edge[NE].cost=cost;
edge[NE].next=head[u];head[u]=NE++;
edge[NE].u=v;edge[NE].v=u;edge[NE].cap=0;edge[NE].cost=-cost;
edge[NE].next=head[v];head[v]=NE++;
}
bool SPFA(int s,int t,int n){
int i,u,v;
queue<int> qu;
memset(vis,0,sizeof(vis));
memset(pp,-1,sizeof(pp));
for(i=0;i<=n;i++) dist[i]=INF;
vis[s]=1;dist[s]=0;
qu.push(s);
while(!qu.empty()){
u=qu.front();qu.pop();vis[u]=0;
for(i=head[u];i!=-1;i=edge[i].next){
v=edge[i].v;
if(edge[i].cap && dist[v]>dist[u]+edge[i].cost){
dist[v]=dist[u]+edge[i].cost;
pp[v]=i;
if(!vis[v]){
qu.push(v);
vis[v]=true;
}
}
}
}
if(dist[t]==INF) return false;
return true;
}
int MCMF(int s,int t,int n){//鏈灝忚垂鐢ㄦ渶澶ф祦
int flow = 0; //鎬繪祦閲?br /> int i,minflow,mincost;
mincost = 0;
while(SPFA(s,t,n)){
minflow = INF+1;
for(i=pp[t];i!=-1;i=pp[edge[i].u])
if(edge[i].cap<minflow)
minflow = edge[i].cap;
flow+=minflow;
for(i=pp[t];i!=-1;i=pp[edge[i].u]){
edge[i].cap-=minflow;
edge[i^1].cap+=minflow;
}
mincost += dist[t]*minflow;
}
sumFlow = flow;//鏈澶ф祦
return mincost;
}
int C[33] , cnt[33] , a[111];
int main() {
while(~scanf("%s",ch)) {
int L = strlen(ch);
memset(C,0,sizeof(C));
for(int i=0;i<L;i++) {
int aa = ch[i] - 'a';
C[aa] ++;
}
scanf("%d",&k);
n = 27 * k + 30;
int s = 27 * k + 28 , t = 27 * k + 29;
init();
for(int i=0;i<26;i++) if(C[i]) addedge(s,i,C[i],0);
for(int i=1;i<=k;i++) {
for(int j=0;j<26;j++) {
if(C[j]) addedge(j,i*27+j,C[j],0);
}
scanf("%s",ch);
scanf("%d",&a[i]);
int len = strlen(ch);
memset(cnt,0,sizeof(cnt));
for(int j=0;j<len;j++) {
int aa = ch[j] - 'a';
cnt[aa] ++;
}
for(int j=0;j<26;j++) {
if(cnt[j]) {
addedge(27*i+j,27*i+26,cnt[j],0);
}
//printf("a[i] is %d\n",a[i]);
}
addedge(27*i+26,t,a[i],i);
}
int ans = MCMF(s,t,n);
if(sumFlow == L) printf("%d\n",ans);
else printf("-1\n");
//printf("default : sumFlow is %d , mincost is %d \n",sumFlow,ans);
}
return 0;
}
閫嗗簭瀵?/p>
TimeLimit: 1 Second MemoryLimit: 32 Megabyte
Totalsubmit: 20 Accepted: 4
Description
閫嗗簭瀵瑰ぇ瀹墮兘鐭ラ亾錛屽浜?-n鐨勪換鎰忎竴涓帓鍒楋細a1,a2,a3...an錛屽鏋?瀛樺湪i<j錛屼笖ai>aj錛屽垯(i,j)縐頒箣涓轟竴瀵歸嗗簭瀵廣傛垜浠父甯稿叧蹇冧竴涓帓鍒楃殑閫嗗簭瀵圭殑鎬繪暟錛屽洜涓哄畠鍙互鍙嶆槧涓涓帓鍒楃殑鏈夊簭紼嬪害銆傜幇鍦?LAM鎯崇煡閬?鍦?-n鐨勬墍鏈夋帓鍒椾腑錛屾湁澶氬皯鎺掑垪鐨勯嗗簭瀵規繪暟鎭板ソ涓簁銆?br />
Input
絎竴琛屼負姝f暣鏁癟,琛ㄧず鏁版嵁緇勬暟錛屾帴涓嬫潵T琛岋紝姣忚涓や釜姝f暣鏁?n,k(n,k<=1000)銆?br />
Output
瀵逛簬姣忎釜杈撳叆錛岃緭鍑轟竴琛岃〃紺烘伆濂戒負k鐨勬帓鍒楃殑涓暟銆傜敱浜庢暟瀛楀彲鑳借緝澶э紝鍙渶瑕佽緭鍑簃od10000鐨勭粨鏋滃嵆鍙?br />
Sample Input
1
4 1
Sample Output
3
Source
lrl
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int f[1010][1010];
int sum[1010][1010];
int n , k , T;
int S(int nn , int kk) {
if(kk<0) return 0;
else return sum[nn][kk] % 10000;
}
void init() {
for(int i=1;i<=1000;i++) f[i][0] = sum[i][0] = 1;
for(int i=1;i<=1000;i++)
for(int j=1;j<=1000;j++) {
f[i][j] = (S(i-1,j) - S(i-1,j-i)) % 10000;
while(f[i][j] < 0) f[i][j] += 10000;
sum[i][j] = ( sum[i][j-1] + f[i][j] ) % 10000;
}
}
int main() {
init();
scanf("%d",&T);
while(T--) {
scanf("%d%d",&n,&k);
printf("%d\n",f[n][k]);
}
return 0;
}