UVALIve6661--Equal Sum Sets
题意:给你三个数,n,k,s,序列中每个数都不超过n且各不相同,序列共有k个数,这些数的和为s,问满足条件的序列有几个,序列无顺序。
因为数据比较小,所以我用dfs来做,但是我经常在标记部分出错,这回小白把我DFS里的循环初始改了,就过了,然后标记没起作用。。。
#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 100005
#define eps 1e-7
#define INF 0x7FFFFFFF
#define ff sqrt(5.0)
typedef long long ll;
int n,k,s;
int vis[155];
int ans;
void dfs(int aa,int p,int sum){
if(p==k){
if(sum==s){
//cout<<aa<<" "<<p<<" "<<sum<<endl;
ans++;
}
return ;
}
if(p>k) return ;
if(sum>s) return ;
for(int i=aa;i<=n;i++){
if(vis[i]==0){
vis[i] = 1;
dfs(i,p+1,sum+i);
}
vis[i] = 0;
}
}
int main(){
int i,j;
while(scanf("%d%d%d",&n,&k,&s)!=EOF){
if(n==0||k==0||s==0) break;
ans = 0;
memset(vis,0,sizeof(vis));
//cout<<n<<k<<s<<endl;
for(int i=1;i<=n;i++){
vis[i] = 1;
dfs(i,1,i);
//vis[i] = 0;
}
printf("%d\n",ans);
}
return 0;
}
UVALIve6662--The Last Ant【模拟】
题意:一条木棍上有一些蚂蚁,有的朝左走有的朝右走,他们如果在宽的地方相遇就能通过,在窄的地方相遇就掉头往回,速度恒定,问多久所有蚂蚁都能爬出去和最后一只出去的蚂蚁序号。
模拟每一秒,我写了两遍,第一次写矬了,改来改去越搞代码越多越不知道bug在哪,索性重写了一遍。每秒钟让蚂蚁走一格,都走完之后按位置排序,然后判断如果两个蚂蚁在同一位置就让它们掉头,直到结束。
#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 100005
#define eps 1e-7
#define INF 0x7FFFFFFF
#define ff sqrt(5.0)
typedef long long ll;
struct node{
int num,pos;
char dir;
}a[25];
bool cmp(node x,node y){
return x.pos<y.pos;
}
int main(){
int l,n,i;
int cnt,ans;
while(scanf("%d%d",&n,&l)!=EOF){
if(n==0&&l==0) break;
cnt = ans = 0;
for(i=0;i<n;i++){
getchar();
cin>>a[i].dir>>a[i].pos;
a[i].num = i+1;
}
sort(a,a+n,cmp);
node ant[2];
int flag;
while(1){
cnt++;
flag = 0;
for(i=0;i<n;i++){
if(a[i].pos<=0||a[i].pos>=l) continue;
if(a[i].dir=='R') a[i].pos++;
else a[i].pos--;
if(a[i].pos==0||a[i].pos==l){
ant[flag] = a[i];
flag++;
}
}
sort(a,a+n,cmp);
for(i=0;i<n-1;i++){
if(a[i].pos==a[i+1].pos){
if(a[i].dir=='L') a[i].dir = 'R';
else a[i].dir = 'L';
if(a[i+1].dir=='L') a[i+1].dir = 'R';
else a[i+1].dir = 'L';
}
}
int ccc = 0;
for(i=0;i<n;i++){
if(a[i].pos<=0||a[i].pos>=l) ccc++;
}
if(ccc==n) break;
}
if(flag==1) ans = ant[0].num;
else{
if(ant[0].dir=='L') ans = ant[0].num;
else ans = ant[1].num;
}
cout<<cnt<<" "<<ans<<endl;
}
return 0;
}
UVALIve6663--Count the Regions【离散化+搜索】
UVALIve6664--Clock Hands【模拟】