【NOIP2010提高组】5.26校模拟
世间唯有暴力与打表不可辜负。
A. 【NOIP 2010 提高组】机器翻译
没记错这题在LuoGu刷过,模拟一下就行这东西,毕竟T1(滑稽)
#include<iostream> #include<queue> using namespace std; int m,n; int Count; bool b[1111]; int ans; queue <int> Q; int main(){ //freopen("translate.in","r",stdin); //freopen("translate.out","w",stdout); cin>>m>>n; int Putin; for(int i=1;i<=n;i++){ cin>>Putin; if(b[Putin]){ } else{ ans++; if(Count<=m-1){ b[Putin]=true; Count++; Q.push(Putin); } else{ b[Q.front()]=false; Q.pop(); b[Putin]=true; Q.push(Putin); } } } cout<<ans; }
B. 【NOIP 2010 提高组】乌龟棋
考场先暴力,不要多BB。
先给我搜他丫的。
#include<iostream> #include<algorithm> //打表出省一,暴力出奇迹 using namespace std; long long Space[5000]; long long Paper[5000]; bool used[5000]; long long n,m; long long ans; inline void DFS(long long Score,long long Pos){ long long mychoice=0; Score+=Space[Pos]; for(long long i=1;i<=m;i++){ if(used[i]==false){ used[i]=true; mychoice=i; DFS(Score,Pos+Paper[i]); used[mychoice]=false; } } ans=max(ans,Score); } int main(){ //freopen("tortoise.in","r",stdin); //freopen("tortoise.out","w",stdout); cin>>n>>m; for(long long i=1;i<=n;i++){ cin>>Space[i]; } for(long long i=1;i<=m;i++){ cin>>Paper[i]; } sort(Paper+1,Paper+1+m); DFS(0,1); cout<<ans; }
然后搜了个20(多捞哦!!!!不够大力吗??
搜一波LuoGu题解…哇。四维数组。看一眼题目数据范围就懂了,疯狂暗示系列么。
各种出牌方法一个一个折腾,一直取最大值。在输入的时候就把每张手牌的个数存好(有点像背包??)
#include<iostream> using namespace std; const int MAXN=50; //思路来源:洛谷题解。已理解并脱离题解重写 int Step[500]; int Card[MAXN][MAXN][MAXN][MAXN]; int Number[MAXN]; int n,m; int main(){ int Index; cin>>n>>m; for(int i=1;i<=n;i++){ cin>>Step[i]; } for(int i=1;i<=m;i++){ cin>>Index; Number[Index]++; } Card[0][0][0][0]=Step[1]; for(int a=0;a<=Number[1];a++){ for(int b=0;b<=Number[2];b++){ for(int c=0;c<=Number[3];c++){ for(int d=0;d<=Number[4];d++){ if(a!=0) Card[a][b][c][d]=max(Card[a][b][c][d],Card[a-1][b][c][d]+Step[1+a+b*2+c*3+d*4]); if(b!=0) Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b-1][c][d]+Step[1+a+b*2+c*3+d*4]); if(c!=0) Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b][c-1][d]+Step[1+a+b*2+c*3+d*4]); if(d!=0) Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b][c][d-1]+Step[1+a+b*2+c*3+d*4]); } } } } cout<<Card[Number[1]][Number[2]][Number[3]][Number[4]]; }
C. 【NOIP 2010 提高组】关押罪犯
看到题目画好的图说实话有并查集的想法,但无奈思维还停滞在普及组,觉得应该用不到并查集。于是乎,暴力了…
#include<iostream> #include<vector> using namespace std; //打表出省一,暴力出奇迹 const int MAXN=20010; const int INF=1e9; int n,m; vector <int> A; vector <int> B; int dp[MAXN][MAXN]; int ans; inline void DFS(int x,int c){ // for(int i=0;j<A.size();j++){ // cout<<A[i]; // } if(c>ans){ return; } if(x==n+1){ //cout<<"now the c is "<<c<<endl; ans=min(c,ans); return; } int MAXA,MAXB; MAXA=MAXB=0; for(int j=0;j<A.size();j++){ MAXA=max(MAXA,dp[x][A[j]]); } for(int j=0;j<B.size();j++){ MAXB=max(MAXB,dp[x][B[j]]); } A.push_back(x); DFS(x+1,max(c,MAXA)); A.pop_back(); B.push_back(x); DFS(x+1,max(c,MAXB)); B.pop_back(); } int main(){ //freopen("prison.in","r",stdin); // freopen("prison.out","w",stdout); cin>>n>>m; int x,y,c; ans=INF; for(int i=1;i<=m;i++){ cin>>x>>y>>c; dp[x][y]=c; dp[y][x]=c; } DFS(1,0); cout<<ans; }
尽管Vector都玩起来了,依然有爆炸现象(当然还有TLE
然后看到LuoGu某大佬天秀思路。把怒气值排序,把敌人的敌人与我关进牢笼。关不进去就是程序终点。完全没有任何毛病并且实现简单清晰明了。
#include<iostream> #include<algorithm> using namespace std; //思路源自洛谷,完全理解并脱离题解重写。 const int MAXN=20500; int a[MAXN]; struct relation{ int prisonA; int prisonB; int FireIndex; }Ships[100400]; int n,m; int Enemy[MAXN]; inline int find(int x){ if(a[x]==x){ return x; } a[x]=find(a[x]); return a[x]; } inline bool check(int x,int y){ if(find(a[x])==find(a[y])){ return true; } return false; } inline bool Ruler(const relation &a,const relation &b){ return a.FireIndex>b.FireIndex; } inline void merge(int x,int y){ x=find(a[x]); y=find(a[y]); a[x]=y; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ a[i]=i; } for(int i=1;i<=m;i++){ cin>>Ships[i].prisonA>>Ships[i].prisonB>>Ships[i].FireIndex; } sort(Ships+1,Ships+1+m,Ruler); for(int i=1;i<=m+1;i++){ if(i==m+1){ cout<<0; return 0; } if(check(Ships[i].prisonA,Ships[i].prisonB)){ cout<<Ships[i].FireIndex; return 0; } else{ if(Enemy[Ships[i].prisonA]==0){ Enemy[Ships[i].prisonA]=Ships[i].prisonB; } else{ merge(Enemy[Ships[i].prisonA],Ships[i].prisonB); } if(Enemy[Ships[i].prisonB]==0){ Enemy[Ships[i].prisonB]=Ships[i].prisonA; } else{ merge(Enemy[Ships[i].prisonB],Ships[i].prisonA); } } } }
Orz…太棒了。
D. 【NOIP 2010 提高组】引水入城