1001 Skip the Class
Skip the Class
終於又開學啦。呃喵最喜歡的就是開學了,因爲這樣她又可以愉快地翹課了(啊?) 呃喵接下來有n節課程需要上(換句話說,可以翹。) 每節課程有相應的課程類型與課程翹課價值。 有一點需要注意的是,呃喵不可以翹同一類課程超過兩次,就是如果這類課已經翹了兩次,接下來就一定要上。 問你在這個條件下,呃喵可以獲得的最大翹課價值。
第一行爲一個整數T,代表數據組數。 接下來,對於每組數據—— 第一行一個整數n,表示接下來需要依次上的課程數量, 接下來有n行,每行包括一個僅由'a'~'z'構成的長度不超過10的字符串s與一個正整數v。 其中字符串表示課程的類型,相同的字符串代表相同的課程。 數據保證—— 1 <= T <= 1000 對於每組數據,1 <= n <= 100,1 <= |s| <= 10, 1 <= v <= 1000
對於每組數據,輸出一行。 該行有1個整數,表示呃喵可以獲得的最大翹課價值。
2 5 english 1 english 2 english 3 math 10 cook 100 2 a 1 a 2
115 3
對於每個課程只需要存儲它的最大的兩個翹課價值-.-
課程名需要map 成 int ,方便儲存 -.-
代碼:
#include<cstdio>
#include<string>
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
int shu[120][2];
void slove()
{
int a,n,b=1,c;
map<string,int> ma;
int ll=0;
string ch;
scanf("%d",&n);
memset(shu,0,sizeof(shu));
for (int i=0;i<n;i++)
{
cin>>ch>>a;
if (ma[ch])
{
c=ma[ch];
if (a>shu[c][0])
{
shu[c][0]=a;
if (shu[c][0]>shu[c][1])
{
a=shu[c][1];
shu[c][1]=shu[c][0];
shu[c][0]=a;
}
}
}
else
{
ma[ch]=b++;
c=ma[ch];
if (a>shu[c][0])
{
shu[c][0]=a;
if (shu[c][0]>shu[c][1])
{
a=shu[c][1];
shu[c][1]=shu[c][0];
shu[c][0]=a;
}
}
}
}
int ans=0;
for (int i=0;i<=b;i++)
ans+=shu[i][0]+shu[i][1];
printf("%d\n",ans);
}
int main()
{
int t;scanf("%d",&t);
for (int i=0;i<t;i++)
slove();
return 0;
}
1002 Count the Sheep
Count the Sheep
開學翹課固然快樂,然而也有讓呃喵抓狂的事,那當然就是考試了!這可急壞了既要翹課又想要打BC還要準備考試的呃喵。 呃喵爲了準備考試沒有時間刷題,想打BC又不想跌分,只得求助於BCround92的出題人snowy_smile,讓他說點什麼 ~~>_<~~。 snowy_smile實在沒有辦法,但是又不好意思透題,只好告訴呃喵,當務之急是好好休息。 "如果你按照下面這個辦法睡着,那麼第二天就絕對不會在BC的賽場上跌分—— 想象一片一望無際、廣闊無邊的青青草原,草原上住着一羣羊,包括n只沉默的男羊和m只流淚的女羊,在男羊和女羊之間,存在k個朋友關係。 現在你可以以任意一隻羊爲起點,順着朋友關係數下去。如果能夠連續數4只各不相同的羊,就能超過99%的數羊者,成功入睡。" 呃喵聽後十分震驚,但她還是聽話地數下去,果然,數到第4只羊就睡着了,並一口氣睡過了頭,成功地錯過了第二天的BestCoder,真的不會在BC的賽場上跌分啦! 然而你,可就沒有這麼好的運氣了,你既然看到了這第二題,自然一般已有提交,已經無法回頭了。 面對"不AC這題就可能跌分"窘境的你,需要說出,呃喵在睡前可能有多少種不同的數羊序列。 即輸出"A-B-C-D"這樣序列的方案數,滿足A-B、B-C、C-D是朋友關係且A、B、C、D各不相同。
第一行輸入數據組數T 對於每組數據,第一行有三個整數n, m, k,表示n只男羊編號分別爲1~n,m只女羊編號分別爲1~m,並且存在k個朋友關係。 接下來給出k行,每行給出兩個數x y,表示第x只男羊和第y只女羊是朋友。 數據保證—— 不會給出重複的朋友關係 1 <= T <= 1000 對於30%的數據,1 <= n, m, k <= 100 對於99%的數據,1 <= n, m, k <= 1000 對於100%的數據,1 <= n, m, k <= 100000
對於每組數據,輸出一行,該行包含一個整數,表示呃喵睡覺前可能數了哪4只羊的序列的方案數。
(爲了方便閱讀,樣例輸入中數據組間中會額外添加一行空行) 3 2 2 4 1 1 1 2 2 1 2 2 3 1 3 1 1 2 1 3 1 3 3 3 1 1 2 1 2 2
8 0 2
第一組樣例:(b1-g1-b2-g2) (b1-g2-b2-g1) (b2-g1-b1-g2) (b2-g2-b1-g1) (g1-b1-g2-b2) (g1-b2-g2-b1) (g2-b1-g1-b2) (g2-b2-g1-b1) 共8種合法序列
A - B - C - D
我們可以考慮 A 爲 男生 --最後將 ABCD 可以直接翻轉爲 DCBA (女生開始)
然後考慮 A - B —— C - D
B爲女,C 爲男, 當B 和 C 有 關係時才成立, 所以會有一個A=C的, 同理也有一個B=D的
然後我們只需要考慮中間那個邊是哪一條邊所連接的就行了,
先儲存一下每個男生女生所在的邊數、然後依次枚舉中間那條邊即可。
代碼:
#include<cstdio>
#include<string>
#include<iostream>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define LL __int64
int n,m,k;
LL shu1[100100],shu2[100100];
int x[100100],y[100100];
void slove()
{
int a,b;
scanf("%d%d%d",&n,&m,&k);
memset(shu1,0,sizeof(shu1));
memset(shu2,0,sizeof(shu2));
for (int i=0;i<k;i++)
{
scanf("%d%d",&a,&b);
shu1[a]++;shu2[b]++;
x[i]=a;y[i]=b;
}
LL ans=0;
for (int i=0;i<k;i++)
{
a=x[i];b=y[i];
ans+=(shu1[a]-1)*(shu2[b]-1);
}
printf("%I64d\n",ans*2);
}
int main()
{
int t;scanf("%d",&t);
for (int i=0;i<t;i++)
slove();
return 0;
}
1003 Girls Love 233
Girls Love 233 Accepts: 30 Submissions: 218
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
問題描述
除了翹課以外,結識新的妹子也是呃喵重要的日程安排之一。
這不,呃喵又混進了一個叫做ACgirls的女生羣裏,來達成自己不可描述的目的。
然而,呃喵只會喵了個咪地說話,於是很容易引起注意。爲了掩飾自己的真實身份,呃喵每次說話都小心翼翼。
她知道,很多女生都喜歡說"233",然而呃喵想說的話一開始就確定好了,所以她要對這句話做修改。
這句話的長度爲n,語句裏的字符不是'2'就是'3'。
呃喵的智力非常有限,只有m點。她每次操作可以交換兩個相鄰的字符,然而代價是智力-2。
現在問你,在使得自己智力不降爲負數的條件下,呃喵最多能使這個字符串中有多少個子串"233"呢?
如"2333"中有一個"233","232323"中沒有"233"
輸入描述
第一行爲一個整數T,代表數據組數。
接下來,對於每組數據——
第一行兩個整數n和m,分別表示呃喵說的字符串長度 以及呃喵的智力
第二行一個字符串s,代表呃喵具體所說的話。
數據保證——
1 <= T <= 1000
對於99%的數據,1 <= n <= 10, 0 <= m <= 20
對於100%的數據,1 <= n <= 100, 0 <= m <= 100
輸出描述
對於每組數據,輸出一行。
該行有1個整數,表示最多可使得該字符串中有多少個"233"
輸入樣例
3
6 2
233323
6 1
233323
7 4
2223333
輸出樣例
2
1
2
用 dp[i][j][k] 第i個2在j處剩餘k智商 所得到的 233 串
統計2的個數和位置,
然後從左向右枚舉每一個2的位置----
最後最大值即可。
在枚舉過程中要保證 i 的位置在 i-1 的後面。
代碼:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ch[102];
int ll,n,m,ans;
int dp[102][102][52];// dp[i][j][k] 第i個2在j處剩餘k智商 所得到的 233 串
int wei[102];
void slove()
{
scanf("%d%d",&n,&m);
m/=2;
scanf("%s",ch+1);ll=0;
for (int i=1;i<=n;i++)
if (ch[i]=='2')
wei[++ll]=i;
//printf("%s %d\n",ch+1,ll);
if (ll==0||ll>n-2)
printf("0\n");
else
{
ans=0;
int cost;
for (int i=1;i<=ll;i++)
for (int j=1;j<=n;j++)
for (int k=0;k<=m;k++)
dp[i][j][k]=-1;
//cout<<dp[2][4][0]<<endl;
// cout<<m<<endl;
for (int i=1;i<=ll;i++)
{
for (int j=max(1,wei[i]-m);j<=min(wei[i]+m,n);j++)
{
cost=abs(wei[i]-j);
if (i==1)
dp[i][j][m-cost]=0;
else
{
for (int jj=i-1;jj<j;jj++)
{
for (int kk=m;kk>=cost;kk--)
{
if (dp[i-1][jj][kk]!=-1)
{
if (jj+2<j)
dp[i][j][kk-cost]=max(dp[i][j][kk-cost],dp[i-1][jj][kk]+1);
else
dp[i][j][kk-cost]=max(dp[i][j][kk-cost],dp[i-1][jj][kk]);
// printf("%d %d %d %d %d\n",i,j,kk-cost,kk,cost);
}
}
}
}
}
}
for (cost=0;cost<=m;cost++)
{
for (int i=ll;i<=n;i++)
{
if (dp[ll][i][cost]!=-1)
{
// printf("%d ------ %d %d %d\n",dp[ll][i][cost],ll,i,cost);
ans=max(ans,dp[ll][i][cost]+(i+1<n));
}
}
}
printf("%d\n",ans);
}
}
int main()
{
int t;scanf("%d",&t);
while (t--)
slove();
return 0;
}