T1
【題目描述】
給你N個字符串,你每次可以選擇其中一個字符串的一段前綴進行翻轉,但是你必須保證這個前綴的長度是偶數。你可以進行無限次這樣的操作,並且如果
兩個字符串變得相同的時候,你就可以把這兩個字符串都刪除掉,問最後最少剩下多少個字符串?
【輸出格式】
對於每組數據,一行一個整數代表答案。
【樣例輸入】
2
5
esprit
god
redotopc
odcpoter
dog
14
rats
live
stressed
to
act
as
star
desserts
of
evil
cat
sa
fo
ot
【樣例輸出】
3
0
【樣例解釋】
無。
【數據範圍與規定】
對於40%的數據,字符串長度不超過8
對於100%的數據,1<=T<=11,字符串長度不超過50,1<=N<=50
#include <cstdio> #include <cstring> char s[51][51]; int t,n,ans,len[51]; bool vis[51][1001],del[51]; inline void work(int x) { len[x]=strlen(s[x]); --len[x];//長度若是單數,那麼下面枚舉到最後時會出現vis[負數]=true for(int i=0;i<len[x];i+=2) vis[x][s[x][i]-'a'+s[x][i+1]-'a']=true; ++len[x]; } inline bool judge(int i,int j) { for(int k=0;k<1001;++k) if(vis[i][k]!=vis[j][k]) return false; // printf("\n%s %s\n",s[i],s[j]); if(len[i]&1) return s[i][len[i]-1]==s[j][len[j]-1]; return true; } inline void clear() { ans=0; memset(vis,false,sizeof vis); memset(del,false,sizeof del); } int main() { freopen("kahuucino.in","r",stdin); freopen("kahuucino.out","w",stdout); scanf("%d",&t); while(t--) { clear(); scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%s",s[i]); for(int i=1;i<=n;++i) work(i);//處理每個字符串的情況 /* printf("\n"); for(int i=1;i<=n;++i) printf("%d ",len[i]); printf("\n"); */ for(int l,i=1;i<=n;++i) { if(del[i])continue; for(int j=i+1;j<=n;++j) { if(del[j]||len[i]!=len[j])continue; if(judge(i,j)) { // printf("\n%d %d\n",i,j); del[j]=true; ans+=2; break; } } } printf("%d\n",n-ans); } fclose(stdin);fclose(stdout); return 0; } /* 5 esprit god redotopc odcpoter dog 樣例第一組數據解釋: redotopc -> cpot oder -> topcod er -> do cpoter -> odcpoter 最後剩3個 以連續兩個字符爲一個單位 */
/* 把字符串拆成有兩個字母的組合 然後將這些組合按照字典序排起來,合到一起形成一個新的字符串 最後判斷這個字符串有沒有出現過 */ #include <algorithm> #include <iostream> #include <string> #include <cstdio> #include <vector> #include <set> std::set<std::string> h; std::string a[55]; int getMin(std::vector<std::string> words) { int n=words.size(),ans=n; h.clear(); for(int i=0;i<n;++i) { int m=words[i].size(); std::string s=""; for (int j=0;j*2<m;++j) { char x=words[i][j*2],y=words[i][j*2+1]; if(x>y)std::swap(x,y); a[j]=x,a[j]+=y; } std::sort(a,a+m/2); for(int j=0;j*2<m;++j)s+=a[j]; if(m&1)s+=words[i][m-1]; if(h.find(s)==h.end())h.insert(s); else h.erase(s),ans-=2; } return ans; } int main() { freopen("kahuucino.in","r",stdin); freopen("kahuucino.out","w",stdout); int T,n,m; std::string s; std::vector<std::string> w; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); w.clear(); for(int i=0;i<n;++i) { std::cin>>s; w.push_back(s); } printf("%d\n",getMin(w)); } fclose(stdin);fclose(stdout); return 0; }
T2
麻耶
【問題描述】
油庫裏是幻想鄉特有的一種生物。每隻油庫裏都有一個戰鬥力值和一個能量值。當兩隻油庫裏戰鬥時,總是戰鬥力值高的一位獲勝。獲勝者的戰鬥力值將變成(自己的原戰鬥力值-對手的戰鬥力值+對手的能量值)。敗者將死去。若兩者戰鬥力值一樣,則同歸於盡。
思考熊發現了很多油庫裏,他想知道通過互相戰鬥之後油庫裏中戰鬥力值+能量值最高的一個可能到達多少。你能幫他們求出來嗎?
(假設除了考察的那隻油庫裏之外,其他油庫裏之間不會發生戰鬥)
【輸入格式】
第一行是一個整數N,代表當前有多少油庫裏。
接下來的N行, 每一行有兩個整數u,v, 代表這隻油庫裏的戰鬥力值和能量值。
【輸出格式】
輸出一個整數,代表油庫裏中戰鬥力值+能量值最高的一個能達到多少。
【樣例輸入】
2
1 2
2 1
【樣例輸出】
4
【樣例解釋】
無。
不是所有油庫裏都要打一遍!!!
本來自信滿滿能拿10分……………………
正解是貪心
題意描述不清……
以爲是所有油庫裏都要打一遍
但是實際是可以隨意選着搞,想和哪個打和哪個打……
#include <algorithm> #include <complex> #include <cstdio> const int N=1e5+7; #ifdef Win32 #define LL "%I64d" #else #define LL "%lld" #endif struct node{ int u,v; }peo[N]; int n; long long ans; int read() { int n=0,w=1;register char c=getchar(); while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();} while(c>='0'&&c<='9')n=n*10+c-'0',c=getchar(); return n*w; } bool cmp(const node &a,const node &b) { if(a.u==b.u)return a.v>b.v; return a.u<b.u; } inline long long max(long long x,long long y) {return x>y?x:y;} int main() { freopen("zyougamaya.in","r",stdin); freopen("zyougamaya.out","w",stdout); n=read(); for(int i=1;i<=n;++i) { peo[i].u=read(); peo[i].v=read(); ans=max(ans,(long long)peo[i].u+peo[i].v); } std::sort(peo+1,peo+n+1,cmp); long long sum=0; for(int i=1;i<=n;++i) { ans=max(ans,sum+peo[i].u+peo[i].v); if(peo[i].u<peo[i].v) sum+=peo[i].v-peo[i].u; } printf("%I64d",ans);//不能用define的LL,只能得10分 fclose(stdin);fclose(stdout); return 0; }
T3
思路:大模擬
注意細節!!!!!
#include <cstdio> #include <string> #include <cstring> #include <iostream> char cmd[20]; struct Node{ int son[101],now,fa,type; //兒子有哪些,現在到了第幾個兒子,父親是誰,是文件還是文件夾(1是文件,2是文件夾) std::string s; Node(){now=0,fa=0;} }a[201]; inline void del_file(int x) { a[x].fa=0; a[x].type=0; a[x].s=' '; } void del_directory(int x) { a[x].fa=0; a[x].s=' '; a[x].type=0; for(int i=1;i<=a[x].now;++i) { if(a[a[x].son[i]].type==1) del_file(a[x].son[i]); else del_directory(a[x].son[i]); a[x].son[i]=0; } a[x].now=0; } int main() { freopen("nacumegu.in","r",stdin); freopen("nacumegu.out","w",stdout); int n,now=-1;//now:現在在哪個裏面 scanf("%d",&n); for(int i=1;i<=n;++i) { // printf("\nGG\n"); scanf("%s",cmd); switch(cmd[0]) { case 'c'://轉換目錄 std::cin>>a[i].s; if(a[i].s[0]=='.') {//向上一級 if(a[now].fa!=0) now=a[now].fa; else printf("No parent directory!\n"); } else {//向下一級 for(int j=1;j<=a[now].now;++j) if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==2) { now=a[now].son[j]; goto S; } printf("No such directory!\n"); } // --i,--n;//沒必要 continue; case 't'://新建文件 std::cin>>a[i].s; for(int j=1;j<=a[now].now;++j) if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==1) {//已經有了 printf("File already exists!\n"); goto S; } a[now].son[++a[now].now]=i; a[i].now=0; a[i].fa=now; a[i].type=1; continue; case 'r'://刪除 std::cin>>a[i].s; if(strlen(cmd)<3) {//刪除文件 for(int j=1;j<=a[now].now;++j) if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==1) {//有 del_file(a[now].son[j]); a[now].son[j]=0; goto S; } printf("No such file!\n"); } else {//刪除文件夾 for(int j=1;j<=a[now].now;++j) if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==2) {//有 del_directory(a[now].son[j]); a[now].son[j]=0; goto S; } printf("No such directory!\n"); } goto S; case 'm': //新建文件夾 std::cin>>a[i].s; for(int j=1;j<=a[now].now;++j) if(a[a[now].son[j]].s==a[i].s&&a[a[now].son[j]].type==2) {//已經有了 printf("Directory already exists!\n"); goto S; } a[now].son[++a[now].now]=i; a[i].now=0; a[i].fa=now; a[i].type=2; continue; case 'l'://輸出目錄下的文件及文件夾 for(int j=1;j<=a[now].now;++j) { if(a[a[now].son[j]].s[0]==' ')continue; std::cout<<a[a[now].son[j]].s; if(a[a[now].son[j]].type==1) printf(" <F>\n"); else printf(" <D>\n"); } } S: ; } fclose(stdin);fclose(stdout); return 0; }