A-活动安排问题
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428
第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
一行包含一个整数表示最少教室的个数。
3 1 2 3 4 2 9
2
#include
#include
#include
using namespace std;
typedef long long ll;
struct node{
ll si,fi;
}a[10050];
int cmp(node x,node y)
{
if(x.si==y.si)
return x.fi=0;j--)
{
if(a[i].simax)
max=count;
}
printf("%d\n",max);
return 0;
}
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1182
输入一个字符串S(S的长度 <= 10000),S中没有除字母外的其他字符。
由你将1-26分配给不同的字母,使得字符串S的完美度最大,输出这个完美度。
dad
77
#include
#include
#include
#define N 10050
using namespace std;
int main()
{
int i,j,k,b[27],sum=0;
char a[N];
scanf("%s",a);
for(i=0;i'Z'?(a[i]-'a'+1):(a[i]-'A'+1)]++;
}
sort(b,b+27);
for(i=26;i>=1;i--)
{
sum+=b[i]*i;
}
printf("%d\n",sum);
return 0;
}
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1212
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000) 第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
输出最小生成树的所有边的权值之和。
9 14 1 2 4 2 3 8 3 4 7 4 5 9 5 6 10 6 7 2 7 8 1 8 9 7 2 8 11 3 9 2 7 9 6 3 6 4 4 6 14 1 8 8
37
#include
#include
int G[1001][1001],vis[1001],dis[1001];
const int inf=0x3f3f3f3f;
int n,m;
void prim()
{
int i,j,k,minz,ans=0;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
{
dis[i]=G[1][i];
}
vis[1]=1;
for(i=2;i<=n;i++)
{
k=0;minz=inf;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]G[k][j])
{
dis[j]=G[k][j];
}
}
}
printf("%d\n",ans);
return ;
}
int main()
{
int i,j,k,x,y,z;
memset(G,inf,sizeof(G));
while(~scanf("%d%d",&n,&m))
{
for(i=0;iz)
{
G[x][y]=G[y][x]=z;
}
}
prim();
}
return 0;
}
D、不重叠的线段
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1133
X轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。
例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠。
Input
第1行:1个数N,线段的数量(2 <= N <= 10000)
第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9)
Output
输出最多可以选择的线段数量。
Input示例
3
1 5
2 3
3 6
Output示例
2
#include
#include
#include
using namespace std;
typedef long long ll;
struct node
{
ll r,l;
}a[10050];
bool cmp(node x,node y)
{
if(x.l==y.l)
return x.r
E、 走格子
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1344
第1行:1个数n,表示格子的数量。(1 <= n <= 50000) 第2 - n + 1行:每行1个数A[i],表示格子里的能量值(-1000000000 <= A[i] <= 1000000000)
输出1个数,对应从1走到n最少需要多少初始能量。
5 1 -2 -1 3 4
2
#include
#include
typedef long long ll;
int main()
{
ll i,x,n,sum=0,minz=1e18;
scanf("%lld",&n);
for(i=0;isum)
{
minz=sum;
}
}
printf("%.0lf\n",fabs(minz));
return 0;
}
F-pie-二分
http://acm.hdu.edu.cn/showproblem.php?pid=1969
#include
#include
#include
const double pi=acos(-1);
const double EPS=1e-5;
double v[10050],V;
int n,f;
int judge(double s)
{
int i,sum=0;
for(i=0;iEPS)
{
mid=(l+R)/2;
if(judge(mid)>=f) {l=mid;}
else {R=mid;}
}
printf("%.4lf\n",mid);
}
return 0;
}
http://acm.hdu.edu.cn/showproblem.php?pid=4768
#include
#include
#include
using namespace std;
typedef long long ll;
const int L=20005;
ll a[L],b[L],c[L];
int main()
{
int i,j,n;
while(~scanf("%d",&n))
{
for(i=0;i
#include
#include
using namespace std;
#define ll __int64
#define N 20050
ll a[N],b[N],c[N],l,r,n;
int solve(ll mid)
{
ll k,sum=0;
int i;
for(i=0;i=a[i])
sum+=(k-a[i])/c[i]+1;
}
return sum;
}
int main()
{
int i,j;
while(~scanf("%d",&n))
{
for(i=0;i>1;
if(solve(mid)%2)
r=mid;
else
l=mid+1;
}
if(l==1ll<<31)
{
printf("DC Qiang is unhappy.\n");
}
else
{
while(!solve(l)%2)
l--;
printf("%d %d\n",l,solve(l)-solve(l-1));
}
}
return 0;
}
H-pog loves szh II -二分((A+B )%mod)
#include
#include
using namespace std;
typedef long long ll;
int main()
{
ll n,m,p,x,a[100050];
while(~scanf("%lld%lld",&n,&p))
{
for(int i=0;ip)
r--;
else
l++;
}
printf("%lld\n",max(ans2,ans1));
}return 0;
}
I-Rightmost Digit(快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=1061
Problem Description
Given a positive integer N, you should output the most right digit of N^N.
Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case contains a single positive integer N(1<=N<=1,000,000,000).
Output
For each test case, you should output the rightmost digit of N^N.
Sample Input
2 3 4
Sample Output
7 6
Hint
In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7. In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
#include
typedef long long ll;
const int mod=10;
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ll n;
scanf("%lld",&n);
printf("%lld\n",qpow(n,n));
}
return 0;
}
J-zhx's contest
http://acm.hdu.edu.cn/showproblem.php?pid=5187
Problem Description
As one of the most powerful brushes, zhx is required to give his juniors n problems. zhx thinks the ith problem's difficulty is i. He wants to arrange these problems in a beautiful way. zhx defines a sequence {ai} beautiful if there is an i that matches two rules below: 1: a1..ai are monotone decreasing or monotone increasing. 2: ai..an are monotone decreasing or monotone increasing. He wants you to tell him that how many permutations of problems are there if the sequence of the problems' difficulty is beautiful. zhx knows that the answer may be very huge, and you only need to tell him the answer module p.
Input
Multiply test cases(less than
1000). Seek
EOF as the end of the file. For each case, there are two integers
n and
p separated by a space in a line. (
1≤n,p≤1018)
Output
For each test case, output a single line indicating the answer.
Sample Input
2 233 3 5
Sample Output
2 1
Hint
In the first case, both sequence {1, 2} and {2, 1} are legal. In the second case, sequence {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1} are legal, so the answer is 6 mod 5 = 1
#include
#include
#include
typedef long long ll;
using namespace std;
ll sucheng(ll a,ll b,ll mod)
{
ll ans=0;
while(b)
{
if(b&1)
{
ans=(ans+a);
if(ans>=mod)ans-=mod;
}
a=a+a;
if(a>=mod)
a-=mod;
b/=2;
}
return ans;
}
ll qpow(ll a,ll b,ll mod)
{
a%=mod;
ll ans=1;
while(b)
{
if(b&1)
ans=sucheng(ans,a,mod);
a=sucheng(a,a,mod);
b/=2;
}
return ans;
}
int main()
{
ll mod,n;
while(scanf("%lld%lld",&n,&mod)!=EOF)
{
printf("%lld\n",(qpow(2,n,mod)-2+mod)%mod);
}
return 0;
}
K-Binary Numbers
Problem Description
Given a positive integer n, find the positions of all 1's in its binary representation. The position of the least significant bit is 0. Example The positions of 1's in the binary representation of 13 are 0, 2, 3. Task Write a program which for each data set: reads a positive integer n, computes the positions of 1's in the binary representation of n, writes the result.
Input
The first line of the input contains exactly one positive integer d equal to the number of data sets, 1 <= d <= 10. The data sets follow. Each data set consists of exactly one line containing exactly one integer n, 1 <= n <= 10^6.
Output
The output should consists of exactly d lines, one line for each data set. Line i, 1 <= i <= d, should contain increasing sequence of integers separated by single spaces - the positions of 1's in the binary representation of the i-th input number.
Sample Input
1 13
Sample Output
0 2 3
#include
int main()
{
int i,n,T;
while(~scanf("%d",&T))
{
while(T--)
{
int a[100000]={0};
scanf("%d",&n);
for(i=0;n;n/=2,i++)
{
if(n&1)
a[i]++;
}
for(int j=0;j
L-符号三角形
http://acm.hdu.edu.cn/showproblem.php?pid=2510
Problem Description
符号三角形的 第1行有n个由“+”和”-“组成的符号 ,以后每行符号比上行少1个,2个同号下面是”+“,2个异 号下面是”-“ 。计算有多少个不同的符号三角形,使其所含”+“ 和”-“ 的个数相同 。 n=7时的1个符号三角形如下: + + - + - + + + - - - - + - + + + - - + + - - + - - - +
Input
每行1个正整数n <=24,n=0退出.
Output
n和符号三角形的个数.
Sample Input
15 16 19 20 0
Sample Output
15 1896 16 5160 19 32757 20 59984
#include
#include
int dp[25][25],ans[25],cnt;
void dfs(int n)
{
int i,j;
if(n>24)
return ;
for(i=0;i<=1;i++)
{
dp[1][n]=i;
cnt+=dp[1][n];
for(j=2;j<=n;j++)
{
dp[j][n-j+1]=dp[j-1][n-j+1]^dp[j-1][n-j+2];
cnt+=dp[j][n-j+1];
}
if(cnt*2==n*(n+1)/2)
{
ans[n]++;
}
dfs(n+1);
cnt-=dp[1][n];
for(j=2;j<=n;j++)
{
cnt-=dp[j][n-j+1];
}
}
}
int main()
{
int n;
dfs(1);
while(scanf("%d",&n),n)
{
printf("%d\n",ans[n]);
}
return 0;
}
M-Connect the Cities http://acm.hdu.edu.cn/showproblem.php?pid=3371
Problem Description
In 2100, since the sea level rise, most of the cities disappear. Though some survived cities are still connected with others, but most of them become disconnected. The government wants to build some roads to connect all of these cities again, but they don’t want to take too much money.
Input
The first line contains the number of test cases. Each test case starts with three integers: n, m and k. n (3 <= n <=500) stands for the number of survived cities, m (0 <= m <= 25000) stands for the number of roads you can choose to connect the cities and k (0 <= k <= 100) stands for the number of still connected cities. To make it easy, the cities are signed from 1 to n. Then follow m lines, each contains three integers p, q and c (0 <= c <= 1000), means it takes c to connect p and q. Then follow k lines, each line starts with an integer t (2 <= t <= n) stands for the number of this connected cities. Then t integers follow stands for the id of these cities.
Output
For each case, output the least money you need to take, if it’s impossible, just output -1.
Sample Input
1 6 4 3 1 4 2 2 6 1 2 3 5 3 4 33 2 1 2 2 1 3 3 4 5 6
Sample Output
1
#include
#include
#define INF 0x3f3f3f3f
int vis[502],map[502][502],dis[502],n,su[502];
void prim()
{
int point=1,length=0,i,j,min;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
dis[i]=map[1][i];
vis[1]=1;
for(i=1;i=INF) break;
for(j=1;j<=n;j++)
if(!vis[j]&&dis[j]>map[point][j])
dis[j]=map[point][j];
}
if(length>=INF) printf("-1\n");
else printf("%d\n",length);
}
int main()
{
int T,m,k,a,b,c,t,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
memset(map,INF,sizeof(map));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c) map[a][b]=map[b][a]=c;
}
while(k--)
{
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d",&su[i]);
for(j=1;j