中南大学的月赛,做了一下,感觉题目很好,没做出的 继续补出来
CSU 1303
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define eps 1e-8
#define inf 0xfffffff
//const ll INF = 1ll<<61;
using namespace std;
//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;
string s;
ll exgcd(ll a,ll &x,ll b,ll &y) {
if(b==0) {
x=1;
y=0;
return a;
}
ll r=exgcd(b,x,a%b,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return r;
}
int main() {
while(cin>>s) {
int i = 2;
ll a =0;
ll b = 1;
ll c = 0;
ll d = 1;
while(s[i] != ‘(‘) {
a = a*10 + s[i] - ‘0‘;
i++;
b *= 10;
}
i++;
while(s[i] != ‘)‘) {
c = c*10 + s[i] - ‘0‘;
i++;
d *= 10;
}
d--;
ll fanzi = a*d + c;
ll fenmu = b*d;
if(fenmu == 0) {
fanzi = a;
fenmu = b;
}
ll x = 1,y = 1;
ll gcd = exgcd(fanzi,x,fenmu,y);
fanzi /= gcd;
fenmu /= gcd;
printf("%lld/%lld\n",fanzi,fenmu);
}
return EXIT_SUCCESS;
}
csu1307
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define eps 1e-8
#define inf 0xfffffff
//const ll INF = 1ll<<61;
using namespace std;
//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;
int n,m,A,B;
typedef struct Node{
int from,to;
int nex;
int w;
};
Node edge[50000 + 5],node[50000 + 5];
int head[2000 + 5];
int dis[2000 + 5];
int tot;
void add(int u,int v,int value) {
edge[tot].from = u;
edge[tot].to = v;
edge[tot].w = value;
edge[tot].nex = head[u];
head[u] = tot++;
}
void clear() {
memset(edge,0,sizeof(edge));
memset(head,-1,sizeof(head));
tot = 0;
}
int spfa(int s,int e) {
for(int i=0;i<=n;i++)
dis[i] = inf;
queue<int> q;
dis[s] = 0;
q.push(s);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].nex) {
int v = edge[i].to;
if(dis[u] + edge[i].w < dis[v]) {
dis[v] = dis[u] + edge[i].w;
if(v != e)
q.push(v);
}
}
}
return dis[e];
}
int cal(int x) {
clear();
for(int i=0;i<m;i++) {
if(node[i].w <= x) {
add(node[i].from,node[i].to,node[i].w);
add(node[i].to,node[i].from,node[i].w);
}
}
int ans = spfa(A,B);
return ans;
}
int main() {
while(scanf("%d %d %d %d",&n,&m,&A,&B) == 4) {
for(int i=0;i<m;i++)
scanf("%d %d %d",&node[i].from,&node[i].to,&node[i].w);
int ans;
int l = 0,r = 100000;
while(l < r) {
int mid = (l + r)/2;
if(cal(mid) < inf) {
ans = cal(mid);
r = mid - 1;
}
else
l = mid + 1;
}
printf("%d\n",ans);
}
return EXIT_SUCCESS;
}
/*
3 3 1 2
1 2 80
1 3 40
2 3 50
3 3 1 2
1 2 90
1 3 10
2 3 20
4 5 1 4
1 2 8
1 4 9
1 3 10
2 4 7
3 4 8
*/csu1313
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define eps 1e-8
#define inf 0xfffffff
//const ll INF = 1ll<<61;
using namespace std;
//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;
const int MOD = 10000;
typedef struct Matrix{
int m[6][6];
};
Matrix b,c,per;
void clear() {
memset(per.m,0,sizeof(per.m));
per.m[0][1] = 1;
per.m[1][0] = 3;
per.m[1][2] = 1;
per.m[2][0] = 2;
per.m[2][3] = 1;
per.m[3][0] = 1;
per.m[3][4] = 1;
per.m[4][5] = 1;
}
Matrix multi(Matrix a,Matrix b) {
Matrix c;
for(int i=0;i<6;i++) {
for(int j =0;j<6;j++) {
c.m[i][j] = 0;
for(int k=0;k<6;k++)
c.m[i][j] += (a.m[i][k] * b.m[k][j])%MOD;
c.m[i][j] %= MOD;
}
}
return c;
}
Matrix quick(int k) {
Matrix ans = b;
Matrix p = per;
while(k) {
if(k&1) {
ans = multi(ans,p);
k--;
}
else {
k >>= 1;
p = multi(p,p);
}
}
return ans;
}
void Print() {
for(int i=0;i<6;i++) {
for(int j=0;j<6;j++)
printf("%d ",per.m[i][j]);
puts("");
}
}
int main() {
clear();
int Case = 0;
int n;
while(scanf("%d",&n) == 1) {
for(int i=0;i<6;i++)
for(int j=0;j<6;j++)
b.m[i][j] = (i == j);
Matrix ans;
memset(ans.m,0,sizeof(ans.m));
b.m[0][0] = 2;
b = quick(n);
int sum = 0;
for(int i=0;i<6;i++) {
sum += b.m[0][i];
sum %= MOD;
}
printf("Case %d: %d\n",++Case,sum);
}
return EXIT_SUCCESS;
}#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define eps 1e-8
#define inf 0xfffffff
//const ll INF = 1ll<<61;
using namespace std;
//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;
int n,k,a,b,q;
int ans[3000 + 5];
struct Node {
int t,d;
Node() {};
Node(int a,int b) {
t = a,d = b;
}
bool operator<(const Node &b) const{
return (d - t * a) < (b.d - b.t * a);
}
};
priority_queue <Node> Q;
void clear() {
memset(ans,0,sizeof(ans));
while(!Q.empty())
Q.pop();
}
int main() {
while(scanf("%d %d %d %d",&n,&k,&a,&b) == 4) {
clear();
int sum = 0;
for(int i=0;i<n;i++) {
int x;
scanf("%d",&x);
if(x <= k)
Q.push(Node(0,x));
else
sum++;
}
for(int i=1;i<=200;i++) {
ans[i] = sum;
if(sum > 0) {
Q.push(Node(i-1,0));
sum--;
}
while(!Q.empty()) {
Node tmp = Q.top();
if(tmp.d + (i - tmp.t) *a <= k)break;
sum++;
Q.pop();
}
}
scanf("%d",&q);
while(q--) {
int x;
scanf("%d",&x);
printf("%d\n",ans[x]);
}
}
return EXIT_SUCCESS;
}
中南大ACM月赛:CSU Monthly 2013 Aug,布布扣,bubuko.com
原文:http://blog.csdn.net/yitiaodacaidog/article/details/20653065