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;
}