今晚无聊,用Java做左下http://acm.pku.edu.cn/JudgeOnline/problem?id=1012,总是超时,刚开始时以为Java效率太差,用c++做多一次,fail again。最后无耻地打表,呵呵,还是AC了。无言……发泄一下!
附源程序:
Java
import java.util.*;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int k = Integer.parseInt(scan.next());
if(k == 0)break;
boolean work = false;
int i = k+1;
do{
work = isSatisfied(k,i++);
}while(!work);
System.out.println(i-1);
}
}
private static boolean isSatisfied(int k,int m){
int total = 2 * k;
LinkedList ll = new LinkedList();
for(int i = 0;i < total;i++){
ll.addLast(i);
}
int start = 0;
for(int i = 0;i<k;i++){
int end = (start + m - 1)%ll.size();
int t = (Integer)ll.remove(end);
if(t+1<=k){
return false;
}
start = end>ll.size()-1?0:end;
}
return true;
}
}
c++:
#include<iostream>
using namespace std;
#define MAXK 13
int IsSatisfied(int k,int m);
int main(){
//cout<<IsSatisfied(10,93312);
//return 1;
int c;
do{
cin>>c;
if(!c)break;
int i = c;
while(1){
cout<<i<<endl;
if(IsSatisfied(c,i++) > 0){
cout<<i-1<<endl;
break;
}
}
}while(1);
return 0;
}
int exed[2*MAXK];
int list[2*MAXK];
int IsSatisfied(int k,int m){
int total = 2*k;
int i;
for(i=0;i<total;i++){
exed[i]=0;
list[i]=(i+1)%total;
}
int pos = 0;
int pre;
for(i = 0; i < k;i++){
for(int j = 0; j < m-1;j++){
pre = pos;
pos = list[pre];
}
if(pos < k)return -1;
//cout<<pos<<endl;
list[pre] = list[pos];
pos = list[pos];
}
return 0;
}