热身赛
A.一定不会产生冲突,所以从1开始必定是最长的
bool vis[maxn];//这个位置标记取了
int main() {
IOS;
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; ++i){
ll j = i;
while(j <= n &&!vis[j]){//注意这里一定要先判j的大小,否则会段错误
cout << j << " ";
vis[j] = true;
j += k;
}
}
return 0;
}
B.
太难受了,自己写的一直找不出错误。
以后这么写吧…
int val[maxn];//已ac
map<int, int> mp;
int sat[maxn];
int main() {
IOS;
int t;
cin >> t;
while(t--){
re(sat);
re(val);
mp.clear();
int n, k, m;
cin >> n >> k >> m;
for (int i = 1; i <= n; ++i){
cin >> val[i];
++mp[val[i]];//记下是奇数个
sat[i] = mp[val[i]];//赋给这一位
}
int kk = m % n;
for(int i = 1; i <= n; ++i){
int te = m / n;
if(m % n >= i)
++te;
if(mp[val[i]] % 2 == 0){
if(sat[i] % 2 != 0){
te = 0;
}
}
else {
if(sat[i] % 2 == 0)
te = (te + 1) / 2;//啊这是为什么啊
//懂了,要看这个数的位数和这个次数能不能对应
else
te = te / 2;
}
if(i == 1)
cout << te;
else
cout << " " << te;
}
cout << endl;
}
return 0;
}
还是第二种方法好懂。
分析了下,这个分类更细。
以后加不加可以写成 t += (n >= i)
int main() {
IOS;
int t;
cin >> t;
while(t--){
re(sat);
re(val);
mp.clear();
int n, k, m;
cin >> n >> k >> m;
for (int i = 1; i <= n; ++i){
cin >> val[i];
++mp[val[i]];//记下是奇数个
sat[i] = mp[val[i]];//赋给这一位
}
int na = m / n, nb = m % n;
for(int i = 1; i <= n; ++i){
int te = 0;
if(mp[val[i]] % 2 == 0){
if(sat[i] % 2)
te = 0;
else
te = na + (nb >= i);
}
else {
te = na / 2;
if(na % 2 == 0){
if(sat[i] % 2 == 0)
te += (nb >= i);
}
else {
if(sat[i] % 2)//一共奇个、奇数次、奇数位
te += (nb >= i);
else
++te;
}
}
if (i == 1)
cout << te;
else
cout << " " << te;
}
if(t >= 1)
cout << endl;
}
return 0;
}
C.
瞎推得,数据范围决定了显然不可能是一个一个试。
开始推的是只由最后一次决定,中间就算是负数也是越走越远。
50%wa后猜测第一次也许会更远,判了第一次后就过了
#define PII pair<int, int>
PII R = {1, 0}, U = {0, 1}, D = {0, -1}, L = {-1, 0};
int main() {
IOS;
int t;
cin >> t;
while(t--){
ll n, k;
cin >> n >> k;
string s;
cin >> s;
//我悟了,这个过程中的最大值
//只需要算最后一次的
ll x = 0, y = 0;
ll ans = abs(x) + abs(y);
for (int i = 0; i < n; ++i){
if(s[i] == 'R'){
x += R.first;
y += R.second;
}
else if(s[i] == 'U'){
x += U.first;
y += U.second;
}
else if(s[i] == 'D'){
x += D.first;
y += D.second;
}
else if(s[i] == 'L'){
x += L.first;
y += L.second;
}
ans = max(ans, abs(x) + abs(y));
}
x = (1ll) * x * (k - 1);
y = (1ll) * y * (k - 1);
ans = max(ans, abs(x) + abs(y));
for (int i = 0; i < n; ++i){
if(s[i] == 'R'){
x += R.first;
y += R.second;
}
else if(s[i] == 'U'){
x += U.first;
y += U.second;
}
else if(s[i] == 'D'){
x += D.first;
y += D.second;
}
else if(s[i] == 'L'){
x += L.first;
y += L.second;
}
ans = max(ans, abs(x) + abs(y));
}
cout << ans << endl;
}
return 0;
}
先去补四川省的