34 条题解
-
20qwe1294410750 LV 4 @ 2017-05-23 18:10:46
#include<cstdio> #define A int #define B n #define C m #define E , #define F now #define D step #define G = #define H direction #define I p #define J char #define K name #define L ; #define M scanf #define N " %d%d" #define O "%d%s" #define P ( #define Q ) #define R & #define S for #define T < #define U + #define V - #define W 0 #define X i #define Y if #define Z % #define QAQ { #define QWQ } #define QVQ [ #define QMQ ] #define EX "%s" #define AA 11 #define BB 100005 #define CC else #define DD main #define EE using #define FF std #define GG namespace #define HH m-- #define II ++i #define JJ while #define KK printf #define LL return EE GG FF L A DD P Q QAQ A B E C E D E F G W E H QVQ BB QMQ E I L J K QVQ BB QMQ QVQ AA /*"QAQ"*/ QMQ L M P N E R B E R C Q L S P A X G W L X T B L II Q M P O E R H QVQ X QMQ E K QVQ X QMQ Q L JJ P HH Q QAQ M P N E R I E R D Q L Y P H QVQ F QMQ Q Y P I Q F G P F V D U B Q Z B L CC F G P F U D Q Z B L CC Y P I Q F G P F U D Q Z B L CC F G P F V D U B Q Z B L QWQ KK P EX E K QVQ F QMQ Q L LL W L QWQ
完美AC/
-
12019-03-15 20:13:40@
nb
-
12018-03-15 17:52:07@
关键都在一句话里了.对于某个询问来讲,它模拟的方向和左右的方向以及小人脸部的朝向有关系.可以用异或运算判断模拟的方向,如果异或结果是1就逆时针,否则顺时针.
#include<bits/stdc++.h> using namespace std; int n,m,k,a[123456]; string s[202020]; int main() { int i; scanf("%d%d",&n,&m); for (i=0;i<n;++i) cin>>a[i]>>s[i]; for (;m--;) { int b,y; scanf("%d%d",&b,&y); k=(k+y*(b^a[k]?1:-1)+n)%n;//关键都在这句话里了. } cout<<s[k]; }
-
02020-04-08 14:57:07@
#include <iostream> //[2016提高组Day1-A]玩具谜题 #include <algorithm> using namespace std; int main() { int n, m; cin >> n >> m; int ans = 0; int *f = new int[n]; string *name = new string[n]; for (int i = 0; i < n; i++) cin >> f[i] >> name[i]; int a, s, k = 0; for (int i = 0; i < m; i++) { cin >> a >> s; if(a == 1) if (f[ans] == 0) ans = (ans + s) % n; else ans = (ans + n - s) % n; else if(f[ans] == 0) ans = (ans + n - s) % n; else ans = (ans + s) % n; } cout << name[ans] << endl; delete[] name; delete[] f; return 0; }
-
02019-07-25 17:25:13@
分析:
1.仔细看题目,找到有用信息;
2.本题分量种情况:一个是小人面向内,另一个是向外;
3.然后根据两种情况选择是向左还是向右;
4.然后再分析一下加减的情况;
不太会写题解,大家原谅。。。
下面上代码O(n):
#include<bits/stdc++.h>
using namespace std;
int n,m,w=1;
struct node{
int p,q;
string z;
}g[100010]; //定义结构体
node h[100010];
int main(){
cin>>n>>m; //输入
for(int i=1;i<=n;i++) cin>>g[i].p>>g[i].z; //循环输入
for(int i=1;i<=m;i++) cin>>h[i].p>>h[i].q;
for(int i=1;i<=m;i++){
if(g[w].p==0){
if(h[i].p==0) w-=h[i].q;
else w+=h[i].q;
} //小人面向内
else{
if(h[i].p==0) w+=h[i].q;
else w-=h[i].q;
} //小人面向外
if(w<=0) w+=n; //进行加减
if(w>n) w-=n;
}
cout<<g[w].z<<endl;
return 0;
} -
02018-09-01 08:51:09@
#include<iostream>
#include<string>
using namespace std;
int ans=1,n,m;
bool cx[100010],rl[100010];
string s[100010];
int gs[100010];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>cx[i]>>s[i];
}
for(int i=1;i<=m;i++)
{
cin>>rl[i]>>gs[i];
}
for(int i=1;i<=m;i++)//cx 0表示朝向圈内,1表示朝向圈外//rl 0表示向左数,1表示向右数
{
if((cx[ans]==0&&rl[i]==1)||(cx[ans]==1&&rl[i]==0))
{
if(ans+gs[i]>n)
{
(ans+=gs[i])-=n;
}
else ans+=gs[i];
}
else
{
if(ans-gs[i]<=0)
{
(ans-=gs[i])+=n;
}
else ans-=gs[i];
}
}
cout<<s[ans]<<endl;
return 0;
} -
02018-03-23 11:09:33@
#include <stdio.h> int face[100001]; char name[100001][11]; int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d%s", &face[i], name[i]); face[i] = face[i] * 2 - 1; } int pos = 1; for (int i = 0; i < m; i++) { int ai, si; scanf("%d%d", &ai, &si); ai = ai * 2 - 1; pos -= ai * face[pos] * si; if (pos < 1) pos += n; else if (pos > n) pos -= n; } printf("%s", name[pos]); }
-
02017-11-05 23:05:19@
var m,n,i,j,k,l:longint;
s:char;
a,b,c:array[0..10100] of longint;
st:array[0..10100] of string;
beginreadln(m,n);
for i:=1 to m do
readln(a[i],s,st[i]);
for i:=1 to n do
readln(b[i],c[i]);
l:=1;
k:=0;
for i:=1 to n do
begin
if a[l]=0 then if b[i]=0 then l:=l-c[i]
else l:=l+c[i]
else if b[i]=0 then l:=l+c[i]
else l:=l-c[i];
if l>m then l:=l-m;
if l<1 then l:=l+m;
end;
writeln(st[l]);end.
-
02017-10-24 17:03:17@
/* *creat at 2017-10-13 18:31:24 *author :XiongXuan */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define inf 0x3f3f3f3f #define forn(i, n) for(int i = 0; i < n; i++) #define fornr(i, n) for(int i = n - 1; i >= 0; i--) /* 思路:建立一个结构体数组d[MAXN],里面存朝向和姓名 循环n次,输入所有人员的数据到d 循环m次,每次输入一组a和s,用ans标记当前的人,减代表顺时针,加代表逆时针 m次后,ans指向的是最后答案。 要注意ans越界的问题。 */ struct DATA { int c; char name[14]; }d[100005]; int main () { // freopen("toy.in","r",stdin); // freopen("toy.out","w",stdout); int n, m, i, ans, a, s; cin >> n >> m; //循环n次,输入所有人员的数据到d for (i = 0; i < n; i++) scanf("%d %s", &d[i].c, d[i].name); ans = 0; //循环m次,每次输入一组a和s,用ans标记当前的人, for (i = 0; i < m; i++) { cin >> a >> s; //减代表顺时针,加代表逆时针 if (a == 0) { if (d[ans].c == 0) ans -= s; else ans += s; } else { if (d[ans].c == 0) ans += s; else ans -= s; } //这里防止ans越界 ans = (ans + n) % n; } //m次后,ans指向的是最后答案 printf("%s\n", d[ans].name); return 0; }
-
02017-10-15 11:38:05@
简洁
#include<iostream>
using namespace std;
int main(){int n,m;
cin>>n>>m;
int a[m],s[m],count = 1;
struct man{
string name;
int dir;
}total[n+1];
for(int i= 1;i<=n;i++){
cin>>total[i].dir>>total[i].name;
}
for(int i = 0;i<m;i++){
cin>>a[i]>>s[i];
if(a[i] == total[count].dir){count = (count-s[i])%n; if(count<=0)count+=n;}
else {count = (count+s[i])%n;if(count==0)count+=n;}
}
cout<<total[count].name;
} -
02017-09-13 19:51:07@
#include<iostream>
#include<algorithm>
using namespace std;
struct p
{
string name;
int turn;
}a[100001];
int main()
{
int n,m,x[100001],y[100001];
int t=1;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i].turn>>a[i].name;
for(int i=1;i<=m;i++)
{
cin>>x[i]>>y[i];
if(a[t].turn!=x[i])
{
t+=y[i];
while(t>n)t=t-n;
}
else
{
t-=y[i];
while(t<=0)t=t+n;
}
}
cout<<a[t].name;
return 0;
} -
02017-09-13 19:50:39@
#include<iostream>
#include<algorithm>
using namespace std;
struct p
{
string name;
int turn;
}a[100001];
int main()
{
int n,m,x[100001],y[100001];
int t=1;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i].turn>>a[i].name;
for(int i=1;i<=m;i++)
{
cin>>x[i]>>y[i];
if(a[t].turn!=x[i])
{
t+=y[i];
while(t>n)t=t-n;
}
else
{
t-=y[i];
while(t<=0)t=t+n;
}
}
cout<<a[t].name;
return 0;
} -
02017-09-13 19:29:32@
#include<iostream>
#include<algorithm>
using namespace std;
struct p{
string name;
int turn;
}a[21];
int main()
{
int n,m,x[1001],y[1001];
int t=1;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i].turn>>a[i].name;
for(int i=1;i<=m;i++)
{
cin>>x[i]>>y[i];
if(a[t].turn!=x[i])
{
t+=y[i];
while(t>n)
{
t=t-n;
}
}
else
{
t-=y[i];
while(t<0)
{
t=t+n;
}
}
}
cout<<a[t].name;
return 0;
} -
02017-08-09 21:27:14@
148ms通过 写了
ReadInt
,ReadBool
和ReadStr
优化读入速度,并且做了循环展开qwq#include <cstdio> #include <cctype> const int MAXN = 100010; int n, m, x, pen; bool f, dir[MAXN]; char name[MAXN][20]; inline int ReadInt() { char _c; int sum(0); while (!isdigit(_c = getchar())); do sum = sum * 10 + _c - '0'; while (isdigit(_c = getchar())); return sum; } inline bool ReadBool() { char _c; while (!isdigit(_c = getchar())); return (_c - '0') ? true : false; } inline void ReadStr(int th){ register int num(0); char _c; while(isspace(_c = getchar())); do name[th][num++] = _c; while (isalpha(_c = getchar())); } int main() { n = ReadInt(), m = ReadInt(); for (register int i = 0; i < n - 1; i += 2) { dir[i] = ReadBool(); ReadStr(i); dir[i + 1] = ReadBool(); ReadStr(i + 1); } if (n & 1) dir[n - 1] = ReadBool(), ReadStr(n - 1); for (register int i = 1; i <= m; ++i) { f = ReadBool(), x = ReadInt(); if (f != dir[pen]) pen = (pen + x) % n; else pen = (pen + n - x) % n; } printf("%s\n", name[pen]); return 0; }
-
02017-08-07 21:48:13@
//脑子清晰 数组别小就没问题
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int a[100001],b[100001],c[100001];
char job[100001][11];
int main()
{ int n,m,i,j,temp=1;
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i]>>job[i];
for(i=1;i<=m;i++)
cin>>b[i]>>c[i];
for(i=1;i<=m;i++)
{
if(a[temp]==0)
if(b[i]==0)
{
temp=temp-c[i];
if(temp<=0)temp+=n;
}
else
{
temp=temp+c[i];
if(temp>n)temp-=n;
}
else
if(b[i]==0)
{
temp=temp+c[i];
if(temp>n)temp-=n;
}
else
{
temp=temp-c[i];
if(temp<=0)temp+=n;
}
}
cout<<job[temp]<<endl;
//system("pause");
return 0;
} -
02017-08-03 16:44:09@
简单模拟
不弄乱了就可以 ^(* ̄(oo) ̄)^
这是accepted的code:#include<bits/stdc++.h> using namespace std; int n,m,cnt,start; bool k[100001]; string ppl[100001]; void use(int con,int step) { int step0=step%n; if((con+k[start])%2==0) { start-=step0; if(start<=0)start+=n; return; } else { start+=step0; if(start>n)start-=n; return; } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>k[i]>>ppl[i]; } bool con; int step; start=1; for(int i=1;i<=m;i++) { cin>>con>>step; use(con,step); } cout<<ppl[start]; }
之前写的过了18个(except NO.12 & NO.16)
#include<bits/stdc++.h> using namespace std; int s[100005],_s,_a,n,m,p,now; char c[100005][15],ch; int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) { scanf("%d",&s[i]); p=0; ch=getchar(); while (ch!='\n') { ch=getchar(); p++; c[i][p]=ch; } c[i][0]=p-1; } now=1; for (int i=1;i<=m;i++) { int fuck=now; scanf("%d%d",&_a,&_s); if (_a==0) { if (s[fuck]==0) now=(now+n-(_s%n))%n; else if (s[fuck]==1) now=(now+(_s%n))%n; } else if (_a==1) { if (s[fuck]==0) now=(now+(_s%n))%n; else if (s[fuck]==1) now=(now+n-(_s%n))%n; } } for (int i=1;i<=c[now][0];i++) printf("%c",c[now][i]); return 0;
有人能帮我找一下错在哪儿吗?谢谢!
-
02017-07-06 23:40:06@
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct people
{
string job;
bool facein;
};
vector<people> peos;
int gl(int s, int n, int t) {if (n-s < 0)
return t - (s - n);
else
return n - s;
}
int gn(int s, int n, int t) {if (s + n >= t)
return s+n-t;
else
return n + s;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
people peo;
cin >> peo.facein >> peo.job;
if (peo.facein)
peo.facein = false;
else
peo.facein = true;
peos.push_back(peo);
}
int nowpeo = 0;
for (int j = 0; j < m; j++) {
int a, s;
cin >> a >> s;
bool t = peos[nowpeo].facein;
if (a == 0 && t == true) {
nowpeo = gl(s, nowpeo, n);
}
else if (a == 1 && t == false) {
nowpeo = gl(s, nowpeo, n);
}
else {
nowpeo = gn(s, nowpeo, n);
}
}
cout << peos[nowpeo].job;
} -
02017-06-08 15:44:19@
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <string> #include <vector> #include <queue> using namespace std; int n,m,p; vector<int> a; vector<string> na; void c_v_1() { a.resize(0); na.resize(0); } int main() { while (~scanf("%d%d",&n,&m)) { c_v_1(); a.resize(n,0); na.resize(n); for (int i=0;i<n;i++) { na[i].resize(10,0); scanf("%d%s",&a[i],&(na[i][0])); } p=0; for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); p+=((x^a[p]!=0)?y:-y); p=(p+n)%n; } printf("%s\n",na[p].c_str()); } }
-
02017-06-06 13:20:06@
#include<stdio.h> #include<iostream> #include<string> using namespace std; int n,m,s[100010],p=0; string w[100010]; int main(){ cin>>n>>m; for(int i=0;i<n;++i) cin>>s[i]>>w[i]; for(int x,y;m--;){ cin>>x>>y; p=(x^s[p])?p+y:p-y; p=(p+n)%n; } cout<<w[p]; }
-
02017-05-21 18:21:00@
exciting,在vijos发的第一个题解233,水一下就好。
模拟就好了
对于逆时针输入,把它当成顺时针的,后面的左右对调即可。
移动时可能会产生负数或越界的,处理方式为 x=(n+x)与x%=n;
x<0时,意味着当前位置在n向前数x绝对值个单位的位置,x>=n由于是个环形的,很显然是x%n。
大概就是这样,稍微调试即可。环境:
win10 64bit
g++
gdb
atom(vim plugin)#include <iostream> #include <string> #define abs(x) ((x)>0?(x):(-(x))) #define log(x) std::cout << x << '\n'; int n,m; struct Node{ int dir; std::string name; Node(int dir=0,std::string name=""){} }node[100010]; int main(int argc, char const *argv[]) { std::cin >> n >> m; for(int i=0;i<n;i++)std::cin >> node[i].dir >> node[i].name; int x=0; for(int i=0;i<m;i++){ int dir,dis;std::cin >> dir >> dis; if(dir==node[x].dir) x-=dis; else x+=dis; if(x<0) x=n+x; x%=n; } std::cout << node[x].name << '\n'; return 0; } #if 0 0 singer 0 reader 0 mengbier 1 thinker 1 archer 0 writer 1 mogician 0 3 1 1 0 2 #endif
信息
- ID
- 2003
- 难度
- 6
- 分类
- (无)
- 标签
- 递交数
- 2710
- 已通过
- 792
- 通过率
- 29%
- 被复制
- 10
- 上传者