PAT 乙级 1069.微博转发抽奖 C++/Java
小明 PAT 考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔 N 个人就发出一个红包。请你编写程序帮助他确定中奖名单。
输入格式:
输入第一行给出三个正整数 M(≤ 1000)、N 和 S,分别是转发的总量、小明决定的中奖间隔、以及第一位中奖者的序号(编号从 1 开始)。随后 M 行,顺序给出转发微博的网友的昵称(不超过 20 个字符、不包含空格回车的非空字符串)。
注意:可能有人转发多次,但不能中奖多次。所以如果处于当前中奖位置的网友已经中过奖,则跳过他顺次取下一位。
输出格式:
按照输入的顺序输出中奖名单,每个昵称占一行。如果没有人中奖,则输出 Keep going...
。
输入样例 1:
9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain
输出样例 1:
PickMe
Imgonnawin!
TryAgainAgain
输入样例 2:
2 3 5
Imgonnawin!
PickMe
输出样例 2:
Keep going...
思路:
对输入的每行字符串进行判断,符合条件的就添加到结果数组中。若当前输入已经在结果数组中能找到,就将s+1,把中奖的顺序往后移一位。
C++实现:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 //1069:微博转发抽奖 5 int main() { 6 int m, n, s, num = 0; 7 cin >> m >> n >> s; 8 vector<string> person(m + 1); 9 vector<string> res; 10 bool flag = false; 11 for (int i = 1; i <= m; i++) { 12 cin >> person[i]; 13 for (int j = 0; j < res.size(); j++) { 14 if (person[i] == res[j]) { 15 s++; 16 } 17 } 18 if (i == s) { 19 cout << person[i] << endl; 20 res.push_back(person[i]); 21 flag = true; 22 s += n; 23 } 24 } 25 if (!flag) { 26 cout << "Keep going..." << endl; 27 } 28 return 0; 29 }
Java实现:
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 public class Main { 8 public static void main(String[] args) throws IOException { 9 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 10 String[] str = in.readLine().split("\\s+"); 11 int m = Integer.parseInt(str[0]); 12 int n = Integer.parseInt(str[1]); 13 int s = Integer.parseInt(str[2]); 14 //ArrayList 是可改变大小的数组 15 List<String>list = new ArrayList<>(); //创建ArrayList 16 boolean flag = false; 17 for (int i = 1; i <= m; i++) { 18 String get = in.readLine(); 19 if(list.contains(get)) 20 s++; 21 if(i == s){ 22 System.out.println(get); 23 list.add(get); 24 flag = true; 25 s += n; 26 } 27 } 28 if(!flag) 29 System.out.println("Keep going..."); 30 } 31 }