简单的模拟(洛谷)

版权声明:转载请在原文附上源连接以及作者,谢谢~ https://blog.csdn.net/weixin_39778570/article/details/83752985

ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
P1003 铺地毯
题目:https://www.luogu.org/problemnew/show/P1003
解法:找最后铺到指定点的地毯,我们不妨倒着铺地毯,第一个铺的就是答案了

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
const int maxn = 1e4;
int n,x[maxn+5],y[maxn+5],g[maxn+5],k[maxn+5],a,b;
int main(){
	scanf("%d",&n);
	fo(i,1,n){
		scanf("%d%d%d%d",&x[i],&y[i],&g[i],&k[i]);
	}
	scanf("%d%d",&a,&b);
	for(int i=n;i>=1;i--){
		if(a>=x[i]&&a<=x[i]+g[i] && b>=y[i]&&b<=y[i]+k[i]){
			printf("%d\n",i);
			return 0;
		}
	} 
	printf("-1\n");
	return 0;
}

P1067 多项式输出
题目:https://www.luogu.org/problemnew/show/P1067
题意:模拟多项式输出
解法:需要注意的点,系数的正负,负的情况想是否为-1,正的情况下是否为1,特判这两种情况,最后注意下一次项和常数项。

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i) 
using namespace std;
const int maxn = 105;
int a[maxn],n;
int main(){
	scanf("%d",&n);
	fo(i,0,n){
		scanf("%d",&a[i]);
	}
	bool fir = 1;
	fo(i,0,n-2){
		if(a[i]==0)continue;
		if(a[i]>0){
			if(a[i]==1&&fir)printf("x^%d",n-i),fir=0;
			else if(a[i]==1)printf("+x^%d",n-i);
			else if(fir)printf("%dx^%d",a[i],n-i),fir=0;
			else   printf("+%dx^%d",a[i],n-i);
		}else if(a[i]<0){
			if(a[i]==-1)printf("-x^%d",n-i),fir=0;
			else printf("%dx^%d",a[i],n-i),fir=0;
		}
	}
	if(n-1>=0 && a[n-1]!=0){
		if(a[n-1]>0){
			if(a[n-1]==1&&fir)printf("x"),fir=0;
			else if(a[n-1]==1)printf("+x");
			else if(fir)printf("%dx",a[n-1]),fir=0;
			else   printf("+%dx",a[n-1]);
		}else{
			if(a[n-1]==-1)printf("-x"),fir=0;
			else printf("%dx",a[n-1]),fir=0;
		}
	}
	if(a[n]!=0){
		if(a[n]>0){
			if(fir)printf("%d",a[n]),fir=0;
			else   printf("+%d",a[n]);
		}else{
			printf("%d",a[n]);
		}
	}
	return 0;
}

P1540 机器翻译
题目:https://www.luogu.org/problemnew/show/P1540
解法:用列队模拟一下就好,满了就把队头踢掉,没满就把外存的单词加进队为(内存),答案+1。无聊写了3个情况。原题输入的“单词”是一个很小的数。万一数字很大呢?那就离散化一下。万一是字符串呢,那就hash一下。如下:

/*原题*/
#include<bits/stdc++.h>
#define ll long long 
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
int m,n,a[1005];
bool vis[1005];
queue<int> q;
int main(){
	cin>>m>>n;
	fo(i,1,n)cin>>a[i];
	int ans = 0;
	fo(i,1,n){
		if(!vis[a[i]]){
			vis[a[i]] = 1;
			ans++;
			q.push(a[i]);
			if(q.size()>m){
				vis[q.front()] = 0;
				q.pop();
			}
		}
	}
	cout<<ans; 
	return 0;
}
/* P1540 机器翻译 字符串hash */
#include<bits/stdc++.h>
#define ll long long 
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
map<string, int> mp;
int n,m,a[1005];
string s; 
bool vis[1005];
queue<int> q;
int main(){
	cin>>m>>n;
	int k = 1;
	fo(i,1,n){
		cin>>s;
		if(!mp[s])mp[s]=k++; // hash 
		a[i] = mp[s];
	}
	int ans = 0;
	fo(i,1,n){
		if(!vis[a[i]]){
			vis[a[i]] = 1;
			ans++;
			q.push(a[i]);
			if(q.size()>m){
				vis[q.front()] = 0;
				q.pop();
			}
		}
	}
	cout<<ans; 
}
/*P1540 机器翻译  大数离散化 */
#include<bits/stdc++.h>
#define ll long long 
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
struct node{
	int val,  idx;
	bool operator < (const node &a)const{return val<a.val;}
}a[1005];
int m,n,ans,t[1005];
bool vis[1005];
queue<int> q;
int main(){
	scanf("%d%d",&m,&n);
	fo(i,1,n)scanf("%d",&a[i].val),a[i].idx=i;
	
	// 离散化 
	sort(a+1,a+1+n);
	int k = 0;
	t[a[1].idx] = k;
	fo(i,2,n){
		if(a[i].val!=a[i-1].val) t[a[i].idx] = ++k;
		else t[a[i].idx] = k;
	}
	// 模拟过程 
	fo(i,1,n){
		if(!vis[t[i]]){
			vis[t[i]] = 1;
			ans ++;
			q.push(t[i]);
			if(q.size()>m){
				vis[q.front()] = 0;
				q.pop();			
			}
		}
	}
	cout<<ans<<endl;
	return 0;
} 

P1056 排座椅
题目和题解:https://blog.csdn.net/weixin_39778570/article/details/83752308
P1328 生活大爆炸版石头剪刀布
题目:https://www.luogu.org/problemnew/show/P1328
解法:用数组模拟一下剪刀石头布的胜负情况,注意,负的时候不扣分

/*P1328 生活大爆炸版石头剪刀布 自己写得跟题解差不多 */
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
int n,k1,k2,a[205],b[205];
int game[][5] = {{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}}; // 数组一定要认真核对 
int main(){
	cin>>n>>k1>>k2;
	fo(i,1,k1)scanf("%d",&a[i]);
	fo(i,1,k2)scanf("%d",&b[i]);
	int ans1=0,ans2=0;
	fo(i,1,n){
		int t1=a[(i-1)%k1+1],t2=b[(i-1)%k2+1];
	//	cout<<t1<<" "<<t2<<endl;
		ans1 += game[t1][t2];
		ans2 += game[t2][t1];
	}
	cout<<ans1<<" "<<ans2;
	return 0;
} 

P1563 玩具谜题
题目:https://www.luogu.org/problemnew/show/P1563
解法:把这些人编号为0-n-1,方便取模。然后模拟往数还是往右数,头朝外左边和头朝里右边往右数,其他往左数,往右加,往左减,然后取模就能模拟一个圈了,注意减法出现会出现负数,要加上取模数

#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
struct node{
	int t;
	string s;
}a[100005];
int n,m;
int main(){
	cin>>n>>m;
	fo(i,0,n-1){
		cin>>a[i].t>>a[i].s;
	}
	int now = 0;
	int t,s;
	fo(i,1,m){
		cin>>t>>s;
		if(a[now].t&&!t || !a[now].t&&t){
			now = (now+s)%n; // 0-n-1
		}else{
			now = (now-s+n)%n;
		}
	}
	cout<<a[now].s;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_39778570/article/details/83752985
今日推荐