• 12108 - Extraordinarily Tired Students (UVA)


    题目链接如下:

    Online Judge

    开始的代码如下:

    1. #include
    2. #include
    3. #include
    4. // #define debug
    5. struct stu{
    6. int a;
    7. int b;
    8. };
    9. int n, pos, cnt, kase = 0;
    10. int main(){
    11. #ifdef debug
    12. freopen("0.txt", "r", stdin);
    13. freopen("1.txt", "w", stdout);
    14. #endif
    15. while(scanf("%d", &n) == 1 && n){
    16. std::vector vec(n);
    17. std::setint>> st;
    18. cnt = 0;
    19. std::vector<int> state(n);
    20. for(int i = 0; i < n; ++i){
    21. scanf("%d %d %d", &vec[i].a, &vec[i].b, &state[i]);
    22. if(state[i] > vec[i].a){
    23. ++cnt;
    24. }
    25. }
    26. st.insert(state);
    27. pos = 1;
    28. while(cnt){
    29. int tmp = 0;
    30. for(int i = 0; i < n; ++i){
    31. if(2 * cnt <= n && state[i] == vec[i].a){
    32. state[i] = 1;
    33. } else{
    34. state[i] = state[i] % (vec[i].a + vec[i].b) + 1;
    35. if(state[i] > vec[i].a){
    36. tmp++;
    37. }
    38. }
    39. }
    40. if(st.find(state) != st.end()){
    41. pos = -1;
    42. break;
    43. }
    44. st.insert(state);
    45. cnt = tmp;
    46. pos++;
    47. }
    48. printf("Case %d: %d\n", ++kase, pos);
    49. }
    50. #ifdef debug
    51. fclose(stdin);
    52. fclose(stdout);
    53. #endif
    54. return 0;
    55. }

    写完后又看了下其他人的代码,感觉还可以简化一点。也即,只需要把最先的状态init记录下来,重复回到那个状态就判-1,不用引入set那么麻烦。修改后代码如下:

    1. #include
    2. #include
    3. // #define debug
    4. struct stu{
    5. int a;
    6. int b;
    7. };
    8. int n, pos, cnt, kase = 0;
    9. int main(){
    10. #ifdef debug
    11. freopen("0.txt", "r", stdin);
    12. freopen("1.txt", "w", stdout);
    13. #endif
    14. while(scanf("%d", &n) == 1 && n){
    15. std::vector vec(n);
    16. std::vector<int> init;
    17. cnt = 0;
    18. std::vector<int> state(n);
    19. for(int i = 0; i < n; ++i){
    20. scanf("%d %d %d", &vec[i].a, &vec[i].b, &state[i]);
    21. init.push_back(state[i]);
    22. if(state[i] > vec[i].a){
    23. ++cnt;
    24. }
    25. }
    26. pos = 1;
    27. while(cnt){
    28. int tmp = 0;
    29. for(int i = 0; i < n; ++i){
    30. if(2 * cnt <= n && state[i] == vec[i].a){
    31. state[i] = 1;
    32. } else{
    33. state[i] = state[i] % (vec[i].a + vec[i].b) + 1;
    34. if(state[i] > vec[i].a){
    35. tmp++;
    36. }
    37. }
    38. }
    39. if(init == state){
    40. pos = -1;
    41. break;
    42. }
    43. cnt = tmp;
    44. pos++;
    45. }
    46. printf("Case %d: %d\n", ++kase, pos);
    47. }
    48. #ifdef debug
    49. fclose(stdin);
    50. fclose(stdout);
    51. #endif
    52. return 0;
    53. }

  • 相关阅读:
    word图题表题公式按照章节编号(不用题注)
    数据结构学习笔记 - 分块和莫队
    Cisco ASA、FTD和HyperFlex HX的漏洞分析复现
    hrust工程化学习(六)----最近邻搜索
    2—10岁女童羽绒服,黑色长款也太好看了吧
    终于可以彻底告别手写正则表达式了
    MySQL第四讲·如何正确设置主键?
    10.力扣c++刷题-->罗马数字转整数
    考华为HCIP证书多钱?
    Flink Window&Time 原理
  • 原文地址:https://blog.csdn.net/linh2006/article/details/133740166