原题:

Time limit : 2sec / Memory limit : 256MB

Score : 300 points

Problem Statement

This is an interactive task.

There are N balls labeled with the first N uppercase letters. The balls have pairwise distinct weights.

You are allowed to ask at most Q queries. In each query, you can compare the weights of two balls (see Input/Output section for details).

Sort the balls in the ascending order of their weights.

Constraints

  • (N,Q)=(26,1000)(26,100), or (5,7).

Partial Score

There are three testsets. Each testset is worth 100 points.

  • In testset 1, N=26 and Q=1000.
  • In testset 2, N=26 and Q=100.
  • In testset 3, N=5 and Q=7.

Input and Output

First, you are given N and Q from Standard Input in the following format:

N Q

Then, you start asking queries (at most Q times). Each query must be printed to Standard Output in the following format:

? c1 c2

Here each of c1 and c2 must be one of the first N uppercase letters, and c1 and c2 must be distinct.

Then, you are given the answer to the query from Standard Input in the following format:

ans

Here ans is either < or >. When ans is <, the ball c2 is heavier than the ball c1, and otherwise the ball c1 is heavier than the ball c2.

Finally, you must print the answer to Standard Output in the following format:

! ans

Here ans must be a string of length N, and it must contain each of the first N uppercase letters once. It must represent the weights of the balls in the ascending order.

Judgement

  • After each output, you must flush Standard Output. Otherwise you may get TLE.
  • After you print the answer, the program must be terminated immediately. Otherwise, the behavior of the judge is undefined.
  • When your output is invalid or incorrect, the behavior of the judge is undefined (it does not necessarily give WA).

题目大意:

这是一道交互题。有$N$个小球,用前$N$个大写字母编号,每个小球有不同的重量。

最多允许询问$Q$次。每次询问可以比较两个小球的重量。

按升序输出小球的质量。

一共有三组数据(子任务),每组数据100分。数据规模如下:

子任务编号 $N$ $Q$
$1$ $26$ $1000$
$2$ $26$ $100$
$3$ $5$ $7$

注意事项:

  1. 输出一次就要刷新一次标准输出,否则可能会被误判为TLE;
  2. 输出答案后,程序必须立即退出,否则judger的行为未定义;
  3. 若输出答案不符合格式或不正确,judger的行为未定义(不一定给出WA)。

题解:

第一次做交互题,感觉很新鲜,但是不知道该怎么做。首先程序要与交互库进行交互,根据交互库给出的信息判断小球的质量情况。

对于第一个子任务,由于$Q$的范围很大,直接询问$26^2$次进行一次选择排序就可以了。

对于第二个子任务,由于询问次数只有$100$次,我们假设数组已经有序,二分一个小球质量的位置为$mid$,然后与这个位置的小球的质量进行比较,进行一次插入排序即可。需要询问$26\log_226$次,还是不能通过所有的数据。这就要求我们需要对每一次询问的答案做一个记忆化处理,记录下询问小球的质量关系,然后根据这个质量关系就可以得出有序的数列,从而降低时间复杂度,当然如果不记忆化也有可能能够通过这道题目($123$次询问只比限制大一点)。

也可以写一个归并排序之类的东西。当然需要记忆化,记忆化每一个数大于哪些数小于哪些数(或者只记忆化比这个数大的最小的数与比这个数小的最大的数)。

对于第三个子任务,注意到这组数据非常特殊,其实与给$5$个小球,最多称$7$次求出质量关系的问题相同。可以自己思考一下询问次数最小的方案。

#include<bits/stdc++.h>
using namespace std; char s[29], ans[29];
int cmp['Z'+5]['Z'+5];
int cnt = 0, QQ = 1; bool cmp_user(const char a, const char b) {
char cp;
if(cmp[a][b]==-1) {
printf("? %c %c\n", a, b);
fflush(stdout);
scanf(" %c", &cp);
if(cp=='>') {
cmp[a][b] = true;
cmp[b][a] = false;
return true;
}
else {
cmp[a][b] = false;
cmp[b][a] = true;
return false;
}
}
else return cmp[a][b];
} void ins2(char c) {
if(cmp_user(c, s[1])) {
if(cmp_user(c, s[2])) s[3] = c;
else s[3] = s[2], s[2] = c;
} else {
if(cmp_user(c, s[0])) {
s[3] = s[2];
s[2] = s[1];
s[1] = c;
} else {
s[3] = s[2];
s[2] = s[1];
s[1] = s[0];
s[0] = c;
}
}
} void ins(char c) {
int l = 0, r = cnt;
while(l<r) {
int mid = l+r>>1;
if(cmp_user(c, ans[mid])) l = mid+1;
else r = mid;
}
cnt ++;
if(cmp_user(c, ans[r])) r ++;
for(int i=cnt; i>=r+1; i--) ans[i] = ans[i-1];
ans[r] = c;
} int main() {
int N, Q;
scanf("%d%d", &N, &Q); for(int i=0; i<26; i++) s[i] = (char)(i+'A');
s[N] = '\0'; if(N==26) {
memset(cmp, -1, sizeof(cmp));
cnt = 0;
ans[0] = s[0];
ans[N] = '\0';
for(int i=1; i<N; i++) ins(s[i]); printf("! %s\n", ans);
} else {
memset(cmp, -1, sizeof(cmp));
if(cmp_user(s[0], s[1])) swap(s[0], s[1]);
if(cmp_user(s[2], s[3])) swap(s[2], s[3]);
if(cmp_user(s[1], s[3])) {
swap(s[0], s[2]);
swap(s[1], s[3]);
}
char x = s[2];
if(cmp_user(s[4], s[1])) {
if(cmp_user(s[4], s[3])) {
s[2] = s[3];
ins2(x);
} else {
s[2] = s[4];
s[4] = s[3];
ins2(x);
}
} else {
if(cmp_user(s[4], s[0])) {
s[2] = s[1];
s[1] = s[4];
s[4] = s[3];
ins2(x);
} else {
s[2] = s[1];
s[1] = s[0];
s[0] = s[4];
s[4] = s[3];
ins2(x);
}
}
printf("! %s\n", s);
}
return 0;
}

  

非传统题初探——AtCoder Practice Contest #B - インタラクティブ練習 (Interactive Sorting)的更多相关文章

  1. 【刷题】AtCoder Regular Contest 003

    A.GPA計算 题意:\(n\) 个人,一个字符串表示每个人的等第,每种等第对应一种分数.问平均分 做法:算 #include<bits/stdc++.h> #define ui unsi ...

  2. 【刷题】AtCoder Regular Contest 002

    A.うるう年 题意:判断闰年 做法:.. #include<bits/stdc++.h> #define ui unsigned int #define ll long long #def ...

  3. 【刷题】AtCoder Regular Contest 001

    A.センター採点 题意:给一个只包含1.2.3.4的字符串,求出现次数最多和最少的字符 做法:还能怎么做... #include<bits/stdc++.h> #define ui uns ...

  4. AtCoder Beginner Contest 068 ABCD题

    A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...

  5. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  6. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  7. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  8. AtCoder Grand Contest 010

    AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...

  9. AtCoder Grand Contest 009

    AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...

随机推荐

  1. 通过urllib2抓取网页内容(1)

    一.urllib2发送请求 import urllib2 url = 'http://www.baidu.com' req = urllib2.Request(url) response = urll ...

  2. Redis 3.0.0 正式版出炉,高性能 K/V 服务

    Redis 3.0.0 正式版最终到来了,与 RC6 版本号比較.该版本号改进包含: * 修复了无磁盘的复制问题 (Oran Agra) * 在角色变化后对 BLPOP 复制进行測试 (Salvato ...

  3. 从头认识java-15.6 队列(Queue)

    这一章节我们来讨论一下队列(Queue). 1.什么是队列? 队列是一种特殊的线性表,特殊之处在于它仅仅同意在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样.队列是 ...

  4. Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误

    这篇是计算机类的优质预售推荐>>>><Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误> 编辑推荐 纠错式学习,从"陷阱 ...

  5. 尝试create tech team

    自从上一家公司之后,我很少有机会去带一些新人(公司一般都招一些技术独立性的工程师),特别是经验不是特别多的新小伙伴.在如今管理扁平化的公司,我正逐渐搭建自己的小team,并试图让团队成员快速融入并成长 ...

  6. JS容易犯错的this和作用域

    var someuser = { name: 'byvoid', func: function() { console.log(this.name); } }; var foo = { name: ' ...

  7. spring:为javabean的集合对象注入属性值

    spring:为JavaBean的集合对象注入属性值 在 spring 中可以对List.Set.Map 等集合进行配置,不过根据集合类型的不同,需要使用不同的标签配置对应相应的集合. 1.创建 Ts ...

  8. 无损压缩算法历史——熵编码是最早出现的,后来才有Lzx这些压缩算法

    Lossless   Entropy type Unary Arithmetic Asymmetric Numeral Systems Golomb Huffman  Adaptive Canonic ...

  9. 杂项:ASP.NET Web API

    ylbtech-杂项:ASP.NET Web API ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务. ASP.NET Web A ...

  10. Hardwood Species(map)

    http://poj.org/problem?id=2418 题意:给定一系列字符串,要求按字典序升序输出每个串,并输出每个串出现的百分比. 用map做的,交c++A了,G++ WA..so sad. ...